【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤

简介: 【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤

一、库的作用

1、提高开发效率,让开发者所有的函数实现不用从零开始。

2、隐藏源代码。

      库其实就是所有的.o文件用特定的方式进行打包形成一个文件,各个.o文件包含了源代码中的机器语言指令。

二、动态库和静态库的制作和使用

2.1、静态库的制作和使用

先将我们的.c文件或者是.cpp文件形成.o文件,指令为:

gcc/g++ -c 要形成的.o文件名 .c文件

      假设在我当前目录下有mystdio.o和mymath.o两个.o文件,要将这两个.o文件打包形成静态库,我们要用ar指令

ar -rc libmyc.a(名字,.a后缀表示静态库,真正的库名要去掉lib,去掉.a)mystdio.o mymath.o (跟上.o文件名)

        上面指令-rc中的r表示replace,c表示create,也就是说你要我形成的这个库如果原本没有,我就帮你形成一个新的库,如果有了那我就把你原来旧的库替换掉。

      此时在我当前路径下就有这个库了。但是,当我们去编译的时候,gcc编译器是不认识我们这个静态库的,gcc默认只能识别lib64目录下的C标准库,要让gcc链接我们的库,需要在指令中指明哪一个库让gcc链接。

gcc -o myexe(要形成的可执行文件名) test.c(所依赖的文件) -lmyc(指明要链接myc这个静态库) -L .(-L + 路径表示myc这个库在哪个路径下)

2.2、动态库的制作和使用

fPIC:产生位置无关码,在将.c或者.cpp形成.o文件时,需要加上-fPIC。要形成动态库必须加上-fPIC。

加上-fPIC同样可以形成.o文件。

形成动态库不需要用到其它指令,gcc编译器就可以形成动态库,只不过要加上-shared命令。

gcc -shared -o libmyc.so(名字,真正的库名要去掉lib和.so) mystdio.o mymath.o(所依赖的.o文件)

        但如果直接使用我们的这个动态库,同样会和我们之前使用静态库一样发生链接错误。那么就同样要告诉编译器我们库的名字和所在的路径(参考上面静态库路径的写法)。

       但是,在ubuntu系统下你会发现,动态库使用静态库的链接方法我们的动态库系统还是找不到(此处特制ubuntu系统,其它系统可能可以正常运行),这时我们就只能将我们的动态库拷贝到系统的usr/lib目录下,因为系统默认寻找库的时候回到/usr/lib目录下找。  

此时在运行我们的程序就能正常运行了,但要注意的是,在指令的最后我们必须指明我们要链接的库,因为这个库是我们自己导到系统中的,需要我们自己指明链接

三、将自己的库打包交给别人

        假设在我当前目录下有libmyc.so动态库,mymath.h,mystdio.h两个头文件,如果我想将这三个文件一起交给别人,就可以把它们打包一起放在一个目录下,一起压缩完再交给别人。

在这里我将指令全部放在makefile中

libmyc.so:mystdio.o mymath.o
        gcc -shared -o $@ $^
.o:.c
        gcc -shared -c $<
#mystdio.o:mystdio.c
#       gcc -c -fPIC $< -o $@
#mymath.o:mymath.c
#       gcc -c -fPIC $< -o $@
.PHONY:clean
clean:
        rm -f *.o libmyc.so
 
.PHONY:output
output:
        mkdir -p ./user/mylib/
        mkdir -p ./user/Headfile/
        cp -rf libmyc.so ./user/mylib/
        cp -rf mystdio.h mymath.h ./user/Headfile/
        tar -czf user.tgz user

四、运行别人给我的库文件和头文件

       假设我自己收到了别人的压缩文件,里面有头文件和库文件,我想使用可以将头文件拷贝到usr/include目录下,将库文件拷贝到usr/lib目录下,最后指定链接哪一个库,就可以使用了。

       现在假设user目录是通过user.tgz解压得到的,下面是user目录下的文件:

       将两个头文件拷贝到usr/include目录下(编译器默认会到include目录下去寻找头文件),将库文件拷贝到usr/lib目录下,编译时指定库链接,就能够运行了。当然了包含main函数的文件要自己写啦!

如果今天我不将我的库文件和头文件拷贝到系统中,则需要:

gcc -o myexe test.c -I ./user/Headfile/(-I + 路径指明要去哪里找头文件) -L ./user/mylib/ -lmyc(-L + 路径 + 库名指明要去哪里找哪一个库)

       如果是这样去做我们会发现编译是能通过的,但当我们要运行我们的可执行程序时,会发现还是找不到库。因为-L只是告诉gcc编译器动态库在哪里,但没有告诉系统动态库在哪里,所以在要运行时系统会找不到动态库。

那如何解决呢?

方法1:添加环境变量LD_LIBRARY_PATH的搜索路径

LD_LIBRARY_PATH变量在你的系统中可能有也可能没有,如果没有自行导入就行。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/sxb/240402/user/mylib(冒号后紧跟你的动态库所在的路径)

        但是因为命令行export是导入到系统内存级别的环境变量中,下次登录系统又会从磁盘配置文件中重新读取环境变量,所以如果要让你配置的这个LD_LIBRARY_PATH环境变量永久生效需要将其配置到.bashprofile文件或者.bashrc文件中。

方法2:通过软链接方式

       在usr/lib目录下建立一个与我们的动态库同名(记住必须要同名)的软链接文件,这样修改的是系统文件,是永久存在的。

方法3:修改加载动态库的配置文件

       在系统这个目录/etc/ld.so.conf.d/下(ld:load加载,so动态库,conf配置文件,d目录),建立.conf后缀的配置文件,文件里面只需要存放动态库的路径即可,系统在寻找动态库的时候默认就会帮我们搜索该目录下的配置文件中所保存的路径。

       在该目录下创建一个我们自己的.conf后缀的文件

       然后只需要在该文件中保存我们的动态库所在的路径

       然后需要让系统知道/etc/ld.so.conf.d/下的文件被修改过了,需要执行ldconfig指令,这样我们的可执行程序在运行时也能找到动态库了。

相关文章
|
7月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
622 3
Linux系统禁用swap
|
7月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
1152 3
|
6月前
|
存储 Linux 开发工具
Linux环境下使用Buildroot配置软件包
使用Buildroot可以大大简化嵌入式Linux系统的开发和维护工作,但它需要对Linux系统和交叉编译有深入的理解。通过上述步骤,可以有效地配置和定制软件包,为特定的嵌入式应用构建高效、稳定的系统。
722 11
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
725 3
Linux系统初始化脚本
|
7月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
847 1
|
7月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1247 1
|
Linux 编译器 vr&ar
|
Linux vr&ar C语言
|
存储 Linux 编译器
Linux静态库与动态库的使用
Linux静态库与动态库的使用
127 2
|
Linux 编译器 vr&ar
【Linux】静态库和动态库
本文详细介绍了Linux系统中静态库和动态库的概念、区别、制作与使用方法,包括它们在链接时的区别、加载机制以及优缺点。
343 0