Linux学习:静态库和动态库

1、库是什么?

将“源代码”变为“二进制格式的源代码”(作用:加密,别人可以用,但不知道其中的内容)。

2、库制作出来之后,如何给用户使用?

需要给用户:头文件(内含接口声明,相当于说明书),制作的库。

3、静态库的制作和使用(windows 中叫 .lib 库 Linux 叫.a 库)

(1)命名规则:libxxx.a,其中
lib: 静态库标识
xxx :库的实际名字
.a :Linux 静态库的后缀
(2) 制作步骤:
1)准备原材料:源代码.c /.cpp 例:a.c 和b.c。
2)将 .c 文件 生成 .o 文件 例:gcc a.c b.c -c // 生成 a.o b.o
3)将 .o 文件 打包 .a 库文件 例:ar rcs libxxx.a a.o b.o
4)发布: 将头文件(放入 include 目录)和库文件(放入 lib 目录),交给用户。
注意:查看静态库内容(包含什么 .o 文件): nm libxxx.a
(3)静态库使用:
1)使用时候,test.c 中要包含静态库的头文件。
2)在 test.c 中直接调用静态库中函数接口。
3)主要在编译:gcc test.c -I ./include/ -L ./ilb -l xxx -o app : 生成 app 可执行程序。
注意:-I 是指定库的名字(掐头去尾)

4、动态库的制作和使用(windows 是 .dll 库 Linux 是.so 库)

(1)命名规则:libxxx.so
(2)制作步骤:注意 gcc 参数
1)准备原材料:源代码.c /.cpp 例:a.c b.c
2)将源文件生成.o 文件 例:gcc a.c b.c -c -fpic
3)将 .o 文件 打包 .so 库文件 例:gcc -shared a.o b.o -o libxxx.so
4)发布:将头文件(放入 include 目录)和库文件(放入 lib 目录),交给用户。
(3)动态库使用:
编译生成 app 可执行文件:gcc test.c -I ./include/ -L ./ilb -l xxx -o app
注意:此时直接运行程序 ./app,会动态加载失败(找不到 libxxx.so),会报错!
error while loading shared libraries:libxxx.so:cannot open shared object file:NO such file or dirrctory
本质:ldd app(检测 app 需要的所有动态库的存放路径和地址) 会发现 libxxx.so 出现not found
原因:
系统会先后从以下 4 个位置下寻找 动态库的路径,然后由动态连接器加载:
1)elf 文件的 DT_RPATH 段(位于可执行文件内部,不好修改)
2)环境变量 LD_LIBRARY_PATH
3)/etc/ld.so.cache 文件列表
4)/lib/ 或者 /user/lib 目录
解决:
方式 1:将 .so 文件拷贝至 /lib 目录(或者 /usr/lib 目录)
sudo cp lib/libxxx.so /lib
此方法不推荐:因为每个人都放入这个目录,如果有动态库重名,会出现覆盖的情况。
方式 2:更新 /etc/ld.so.cache 文件列表 (推荐此方法)
sudo vi /etc/ld.so.conf -> 添加存放动态库的绝对路径 ->执行更新命令:sudo ldconfig
方式 3:设置环境变量
临时设置:关闭终端后会失效,只供测试用。
终端输入命令 :export LD_LIBRARY_PATH =存放动态库的绝对路径:$LD_LIBRARY_PATH
永久设置:
(1)用户级别 :
vi ~/.bashrc(打开配置文件)->将上方命令写入 -> 完成后重启终端。
(2)全局级别 :
vi /etc/profile(打开配置文件)->将上方命令写入 ->完成后重启终端。

5、 静态库和动态库的区别

(1)静态库:静态库被打包到应用程序中,即使不执行程序,库代码仍然在 app 中。
优点:使用简单;执行快;发布应用程序不需要发布库。
缺点:代码空间较大;库变更时应用程序需要重新编译。
(2)动态库:动态库没有被打包到应用程序中,只有在程序调用库函数的时候才会调用动态库。
优点:程序体积小;库变更时程序不需要重新编译(注意:函数接口变化,需要重新编译)。
缺点:使用相对麻烦(需要解决动态加载问题);执行慢;发布应用程序时需要发布库。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值