编译动态库

静态库命令

ar rcs *.o libxxx.a

就是将多个.o文件打包

动态库编译命令

g++ test.c  -fPIC -shared -o libtest.so

Linux下格式为libxxx.so

使用

g++ main.c -L. -ltest  -o a.out

-L. :-L参数是指定库的位置,注意此处有个’.’ 表示当前路径

-l :其中-ltest表示要链接libtest.so

运行报错

./a.out: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

找不到库的原因

Linux是通过 /etc/ld.so.cache 文件搜寻要链接的动态库的。

而 /etc/ld.so.cache 是 ldconfig 程序读取 /etc/ld.so.conf 文件生成的。
(注意, /etc/ld.so.conf 中并不必包含 /lib 和 /usr/lib,ldconfig程序会自动搜索这两个目录)

所以把 libtest.so 所在的路径添加到 /etc/ld.so.conf 中

再以root权限运行 ldconfig 程序更新ld.so.cache

a.out运行时,就可以找到 libtest.so
或者:export LD_LIBRARY_PATH=.

怎么选择

静态库:
优点:

1.静态库被打包到应用程序中,所以加载速度更快(静态库是在链接时直接将代码加载到内存中,而动态库在加载时需要去寻找动态库位置,所以相对更慢一些)

2.发布时无需提供静态库,移植方便(直接将代码链接成可执行文件发给使用者,因此发布时无需提供静态库)

缺点:

1.消耗系统资源,浪费内存(在链接时将代码加载到内存中,因此每有一个使用该静态库的接口就会加载一次该静态库)

2.更新、部署、发布麻烦(当更新静态库中的函数时,需要重新将静态库打包给使用者并重新编译链接,或由发布者重新编译链接为可执行程序再发给使用者)

动态库:
优点:

1.可以实现进程间资源共享(只要有一个程序使用了该动态库,那么该动态库就会被动态加载到内存中,其他程序使用该动态库时可以直接使用,不需要重新加载)

2.更新、部署、发布简单(更新时只需要将原来位置的动态库替换为新的动态库即可,程序在运行时才会动态加载动态库)

3.可以控制何时加载动态库

缺点:

1.加载速度比静态库慢(因为多了一个动态加载即寻找动态库的过程)

2.发布程序时需提供依赖的动态库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值