linux学习第八天(静态库,动态库)

静态库在文件中静态展开,所以有多少文件就展开多少次,非常吃内存,100M展开100次,就是1G,但是这样的好处就是静态加载的速度快

动态库会将动态库加载到内存,10个文件也只需要加载一次,然后这些文件用到库的时候临时去加载,速度慢一些,但是很省内存

动态库和静态库各有优劣,根据实际情况合理选用即可。

静态库制作

静态库名字以lib开头,以.a结尾

例如:libmylib.a

、、

第一步:先写好源代码,然后编译汇编成.o文件

第二步:生成指令ar rcs libmylib.a file1.o

第三步:使用静态库(这里没有申明这三个函数,编译器使用隐式申明出现警告)

加上函数申明就不会警告

左边的define为头文件守卫,防止在代码中多次include头文件,多次展开静态库,带来的额外开销

、、下面将静态库和头文件分别放至其他目录下

、、

可以看出a.out内存远远大于test.c。

动态库

第一步:生成位置无关的.o文件

gcc -c add.c -o add.o -fPIC

使用这个参数过后,生成的函数就和位置无关,挂上@plt标识,等待动态绑定(进入内存后才有地址)

第二步:使用gcc -shared 制作动态库

                gcc -shared lib库名.so ?.o...

第三步:编译可执行程序,指定所使用的动态库。-l:指定库名,-L:指定库路径

                gcc test.c -o a.out -lmymath -L./lib

第四步:运行程序会出错

、、

动态库错误解决

错误原因:(这两个没有关联关系)

链接器:工作于链接阶段,工作时需要-l和-L

动态链接器:工作于程序运行阶段,工作时需要提供动态库所在目录位置

                        通过环境变量:export LD_LIBRARY_PATH=动态库路径(临时)

但是这个时临时的,重启终端就失效了

、、

解决方法

 永久生效:写入终端配置文件 .bashrc

(1)vim ~/.bashrc

(2)写入 export LD_LIBRARY_PATH=动态库路径 (修改后路径不同也会出错)

(3). .bashrc||source .bashrc (重启终端,让修改的bashrc生效)

拷贝自定义动态库 到 /lib (标准C库所在目录位置)

配置文件法

1)sudo vi /etc/ld.so.conf

2)写入 动态库绝对路径  保存

3)sudo ldconfig -v  使配置文件生效。

4)./a.out 成功!!!--- 使用 ldd  a.out 查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值