【Linux】静态库(.a) + 动态库(.so)

张开发
2026/4/16 0:04:01 15 分钟阅读

分享文章

【Linux】静态库(.a) + 动态库(.so)
Linux 静态库(.a) 动态库(.so)统一示例库名test→ 静态库libtest.a动态库libtest.so源文件test.c、main.c头文件路径./include库文件路径./lib用户家目录路径/home/youruser/yourlib一、必备编译参数参数作用-I ./include指定头文件搜索路径-L ./lib指定库文件搜索路径-ltest链接libtest.a/libtest.so-fPIC编译动态库必须加位置无关代码-shared生成动态库-Wl,-rpath./lib程序自带运行库路径二、静态库 libtest.a 制作 使用1. 目录结构./include/test.h test.c main.c ./lib/2. 制作静态库# 1. 编译成 .o 目标文件gcc-ctest.c-otest.o-I./include# 2. 打包静态库标准命令 ar rcsar rcs libtest.a test.o# 3. 移动到库目录mkdir-plibmvlibtest.a ./lib/3. ar 常用完整参数r添加/替换文件c库不存在则创建s生成符号索引必须t查看库内容d删除成员x提取 .ov显示详情ar t ./lib/libtest.a# 查看库内容ar d ./lib/libtest.a test.o# 删除库中文件ar x ./lib/libtest.a# 提取文件4. 编译可执行文件gcc main.c-otest_static-I./include-L./lib-ltest5. 运行静态库无依赖直接运行./test_static三、动态库 libtest.so 制作 使用1. 制作动态库# 1. 编译位置无关目标文件gcc-c-fPICtest.c-otest.o-I./include# 2. 生成动态库gcc-sharedtest.o-olibtest.so# 3. 移动到库目录mkdir-plibmvlibtest.so ./lib/2. 编译程序gcc main.c-otest_dynamic-I./include-L./lib-ltest3. 运行动态库4种标准方法方法1临时环境变量临时测试exportLD_LIBRARY_PATH./lib:$LD_LIBRARY_PATH./test_dynamic方法2单次有效不污染环境最推荐LD_LIBRARY_PATH./lib ./test_dynamic方法3复制到系统库目录永久sudocp./lib/libtest.so /usr/libsudoldconfig ./test_dynamic方法4自定义配置文件最规范永久echo/home/youruser/yourlib|sudotee/etc/ld.so.conf.d/mytest.confsudoldconfig ./test_dynamic方法5编译时写死路径自带路径gcc main.c-otest_dynamic-I./include-L./lib-ltest-Wl,-rpath./lib ./test_dynamic四、静态库 vs 动态库 核心对比项目静态库 .a动态库 .so加载时机编译时拷贝进程序运行时加载运行依赖无必须配置路径程序体积大小内存多进程重复占用共享内存更新库需重编程序替换 .so 即可运行速度快稍慢五、同一目录下同时存在 .a 和 .so 时如何选择链接方式当同一个目录下同时存在libtest.a和libtest.sogcc 有明确的默认规则1. 默认行为gcc 优先选择动态库.sogcc main.c-L./lib-ltest-otest_dynamic→ 链接的是libtest.so2. 强制使用静态库加-static参数gcc 会只找静态库忽略动态库-static必须放在-ltest前面-L先定路径 →-static再定静态 →-l最后链接库gcc main.c -I./include -L.-static-ltest-otest_static→ 链接的是libtest.a3. 验证链接了哪种库ldd test_dynamic# 显示依赖 libtest.so → 动态链接ldd test_static# 显示 not a dynamic executable → 静态链接五、关键注意事项ar rcs是创建静态库标准写法动态库必须加-fPICexport LD_LIBRARY_PATH./lib:$LD_LIBRARY_PATH追加路径不覆盖链接库-l 库名自动省略 lib 和 后缀永久配置路径后必须执行ldconfig同一目录下同时存在libtest.a和libtest.so时默认不加参数gcc 优先链接动态库 .so加-static参数强制链接静态库 .a可使用ldd 可执行文件查看程序是否依赖动态库。

更多文章