
linux静态库、动态库、共享库
发布日期:2021-05-15 08:10:57
浏览次数:21
分类:精选文章
本文共 1523 字,大约阅读时间需要 5 分钟。
Linux下的静态库和动态库是软件开发中常用的组成部分,了解它们的优缺点及制作与使用方法对于程序开发和部署具有重要意义。
静态库
静态库(Static Library)是指在程序编译时就将其编译到目标程序中的动态库。其特点是程序运行时依赖这些库的文件共存,适用于那些需要频繁使用的代码段。
静态库的优点:
- 运行速度快:由于库文件在编译阶段被无缝整合到程序中,运行时无需额外加载,启动速度较快。
- 移植方便:发布时只需提供程序即可,包装程度高,与平台无关。
静态库的缺点:
- 程序体积大:由于将整个库文件复制到目标程序中,导致程序体积膨胀。
- 资源占用过多:需要将完整的库文件复制到每个使用该程序的主进程中,尤其是在多进程环境下导致资源浪费。
- 更新难度大:静态库一旦编译完成,修改后需要重新编译整个库文件,可能导致程序维护成本增加。
动态库
动态库(Shared Library)则是在程序运行时,由程序动态加载到内存执行的库文件。其特点是程序本身体积较小,且各个程序可以共享一个库文件。
动态库的优点:
- 程序体积小:与静态库相比,动态库仅加载程序中需要的部分函数或模块,节省了内存空间。
- 资源共享高效:系统只需将动态库文件一次性加载到内存中,所有引用该库的程序都共享同一份内存版本。
- 升级简便:只要确保动态库的函数名称和调用接口保持一致,便可直接升级,而无需修改各个程序文件。
动态库的缺点:
- 加载延迟:相比静态库,动态库需要程序在运行时加载,导致启动速度稍慢。
- 依赖要求高:动态库的使用需要程序在运行时能够找到确切的动态库文件,发布时通常需要额外提供动态库或以特定环境变量指定查找路径。
库的制作
静态库制作:
制作静态库通常采用ar命令工具。以-created-static-lib为例:
gcc -c calcufuncs.c -o calcufuncs.oar rcs libcalcufunc.a calcufuncs.o
动态库制作:
制作动态库需指定生成动态可执行文件以及位置无关的代码生成选项。以下是以-made-shared-for-shared-library为例:
gcc -shared -fpic calcufuncs.c -o libcalc.so
动态库的使用
程序使用动态库时需使用特定选项指定查找动态库路径:
gcc calculatorT.c -lcalc -L ./ -o mainProDy
关于动态库搜索路径:
可以通过LD_LIBRARY_PATH环境变量指定动态库查找路径:
export LD_LIBRARY_PATH="xxx/ccc/test/ ./"./mainProDy
关于共享库命名规范
为了避免版本冲突,软件包规范化地命名动态库文件。例如,可采用 Cagefish archive(cfw’)规范:
- 发布者:
com.example.libraryname
- 模块名称:
module_version.so
- API版本:
APIversion
命名时应尽量避免使用特殊字符,使用小写字母和数字,例如:libcalc.so
是常用的规范命名模式。
通过ssh脚本测试动态库
可生成一个测试shell脚本:
vi test.sh
#!/bin/bashexport LD_LIBRARY_PATH="xxx/ccc/test/ ./"./mainProDychmod +x test.sh
通过以上方法可以有效将动态库和程序结合使用,具体实践中可根据项目需求调整路径和脚本内容确认环境变量有效设置。
希望以上内容能为您提供对Linux静态库和动态库制作及使用的清晰理解,欢迎根据实际需求进行调整和优化。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月30日 13时14分24秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
3.6.X版本的OSG无法打开osgShadow/ShadowVolume的问题
2021-05-15
LSM树
2021-05-15
Linux上elasticsearch7集群搭建
2021-05-15
vue手写 头部 滑动按钮 点击查看更多,可折叠
2021-05-15
为什么 RTP 的视频的采样率是 90kHz ?
2021-05-15
IDEA快捷键CTRL+SHIFT+F无效
2021-05-15
IDEA 找不到 Persistence窗口解决办法
2021-05-15
海思SDK mkimage command not found
2021-05-15
QT5 退出窗口
2021-05-15
rk3399平台gt9xx触摸屏驱动分析
2021-05-15
X工厂 ERP (SBO) 2006 项目案例
2021-05-15
Android 吸顶布局
2021-05-15
python学习笔记2.3- 循环、判断
2021-05-15
U3D实现WebCamera显示
2021-05-15
SpringCloud第七章Ribbon负载均衡服务调用
2021-05-15
Python我的模块-字符替换
2021-05-15
"cannot be resolved or is not a field"问题解决
2021-05-15