静态库和共享库的简介及总结
制作库文件有什么用?
- 不暴露源码
- 不引入到代码
静态库
(1) 制作步骤
- 编译为
.o
文件 - 将
.o
文件打包:ar rcs libmylib.a file1.o file2.o ...
(ar命令只能打包.o文件) - 将头文件与库一起发布
(2)使用
代码中包含头文件,编译时
-L
指定酷路径,-l
指定库名
(3)优缺点
-
优点
- 执行快(加载到代码段了,不过快不了多少)
- 发布应用时不需要发布库 -
缺点
- 执行程序体积比较大
- 库变更时需要重新编译应用
动态库
(1) 制作步骤
- 编译与位置无关的代码,生成
.o
文件,关键参数-fPIC
- 将
.o
文件打包: 关键参数-shared
,-o
指定库名 - 将库与头文件一起发布
假设我们用a.c、b.c生成libMylib.so,则
gcc -fPIC -c *.c 生成位置无关的.o文件
gcc -shared -o libMylib.so *.o 生成动态库
(2)使用
-L
指定动态库路径,-l
指定库名(与静态库一样,目的是保证ld连接器能够加载)
gcc -o newapp main.c -L ./lib -lmylib -I ./include/
- 如何解决程序运行时找不到动态库的问题
(1)拷贝/链接到/lib或/usr/lib下(不推荐,太危险)
(2) 将库路径增加到环境变量LD_LIBRARY_PATH
中
export LD_LIBRARY_PATH=/home/usr/code/lib/:$LD_LIBRARY_PATH
(3)配置/etc/ld.so.conf
文件,增加/home/usr/myCode/demo/lib路径,执行sudo ldconfig -v
(4)编译时候使用gcc的-Wl,-rpath
选项指定运行时库的搜索路径
(3)优缺点
-
优点
- 执行程序体积小
- 库变更时一般不需要重新编译应用(库接口改了就得重新编译应用程序) -
缺点
- 执行时需要加载动态库,相对而言,比静态库满
- 发布应用时需要同步发布动态库
小知识库
- Linux下
bc
命令可以调用计算器,quit
命令退出 nm
命令查看二进制目标文件(.o文件、动态库、静态库、可执行文件)的符号表ldd
命令打印可执行文件运行时所需的链接库
如果一个可执行二进制文件运行时提示找不到某某.so文件,就可以用
ldd
来看看这个二进制文件运行所需的链接库文件,然后再去看看LD_LIBRARY_PATH
的值是否设置正确,去对应的lib目录下再去找找看.
ldd只能看linux下编译的可执行文件;看不了交叉编译的可执行文件
- 进程的内存空间模型
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程