C语言 静态库和动态库生成

打印 上一主题 下一主题

主题 872|帖子 872|积分 2616

文件目录结构
  1. tree
  2. .
  3. ├── bin
  4. ├── include
  5. │   └── calc.h
  6. ├── lib
  7. │   ├── add.c
  8. │   ├── div.c
  9. │   ├── mul.c
  10. │   └── sub.c
  11. └── src
  12.     └── main.c
  13. 4 directories, 6 files
复制代码
静态库生成

使用ar命令
ar命令用于创建和管理静态库。下面是使用ar命令生成静态库的步骤:
  1. # 编译源文件为目标文件(.o文件)
  2. gcc -c ./lib/*.c
  3. mv *.o ./bin
  4. # 使用ar命令创建静态库文件(.a文件):
  5. ar rcs libcalc.a ./bin/*.o
  6. mv libcalc.a ./lib
  7. gcc src/main.c -I include/ -L lib/ -lcalc -o bin/main
  8. MIAN ENTRY
  9. please input m and n:
  10. 7 2
  11. add:
  12. 7+2=9
  13. sub:
  14. 7-2=5
  15. mul:
  16. 7x2=14
  17. div:
  18. 7/2=3
复制代码
动态库生成
  1. # 编译源文件为目标文件(.o文件)
  2. #-fPIC标志用于生成位置无关代码,位置无关代码是一种可执行或共享库的代码,可以在内存的任何位置加载并运行,而不依赖于特定的内存地址。这在生成共享库(动态链接库)时特别重要,因为共享库需要能够在不同的进程和内存地址中加载,而不会发生冲突或错误。
  3. gcc -c -fPIC lib/*.c
  4. mv *.o ./bin
  5. gcc ./bin/*.o -shared -o lib/libcalc.so
  6. gcc src/main.c -I include/ -L lib/ -lcalc -o bin/main
复制代码
./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory
执行直接报错了,说明系统没有找到库位置
而动态库的搜索路径搜索的先后顺序是:
  1.编译目标代码时指定的动态库搜索路径
  2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径
  3.配置文件/etc/ld.so.conf中指定的动态库搜索路径
  4.默认的动态库搜索路径/lib or /usr/lib
  1. #1 编译目录到指定动态库路径
  2. gcc src/main.c -I include/ -L lib/ -Wl,-rpath="/home/xxx/prj/lee
  3. tcode/src/test/libtest/lib" -lcalc -o ./bin/main
  4. #2 指定环境变量正常执行
  5. export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH
  6. #3 配置文件/etc/ld.so.conf添加库路径
  7. # /home/xxx/prj/leetcode/src/test/libtest/lib
  8. sudo vim /etc/ld.so.conf
  9. sudo ldconfig #更新动态链接器缓存
  10. #4 放入到/usr/lib正常执行
  11. sudo mv lib/libcalc.so /usr/lib
复制代码
如果同时存在动态库和静态库文件,系统会优先选中动态库
参考链接

gcc 使用中常用的参数及命令
动态库加载路径之RPATH与RUNPATH(小记)
GCC创建和使用静态链接库(.a文件)
Options for Linking
Creating and Using Dynamic Libraries ( C )
linux查看、添加、删除环境变量

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表