C语言 静态库和动态库生成
文件目录结构
tree . ├── bin ├── include │ └── calc.h ├── lib │ ├── add.c │ ├── div.c │ ├── mul.c │ └── sub.c └── src └── main.c 4 directories, 6 files
静态库生成
使用ar命令
ar命令用于创建和管理静态库。下面是使用ar命令生成静态库的步骤:
# 编译源文件为目标文件(.o文件) gcc -c ./lib/*.c mv *.o ./bin # 使用ar命令创建静态库文件(.a文件): ar rcs libcalc.a ./bin/*.o mv libcalc.a ./lib gcc src/main.c -I include/ -L lib/ -lcalc -o bin/main MAIN ENTRY please input m and n: 7 2 add: 7+2=9 sub: 7-2=5 mul: 7x2=14 div: 7/2=3
动态库生成
# 编译源文件为目标文件(.o文件) #-fPIC标志用于生成位置无关代码,位置无关代码是一种可执行或共享库的代码,可以在内存的任何位置加载并运行,而不依赖于特定的内存地址。这在生成共享库(动态链接库)时特别重要,因为共享库需要能够在不同的进程和内存地址中加载,而不会发生冲突或错误。 gcc -c -fPIC lib/*.c mv *.o ./bin gcc ./bin/*.o -shared -o lib/libcalc.so 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 编译目录到指定动态库路径 gcc src/main.c -I include/ -L lib/ -Wl,-rpath="/home/xxx/prj/lee tcode/src/test/libtest/lib" -lcalc -o ./bin/main #2 指定环境变量正常执行 export LD_LIBRARY_PATH=$PWD/lib:$LD_LIBRARY_PATH #3 配置文件/etc/ld.so.conf添加库路径 # /home/xxx/prj/leetcode/src/test/libtest/lib sudo vim /etc/ld.so.conf sudo ldconfig #更新动态链接器缓存 #4 放入到/usr/lib正常执行 sudo mv lib/libcalc.so /usr/lib
如果同时存在动态库和静态库文件,系统会优先选中动态库
参考链接
gcc 使用中常用的参数及命令
动态库加载路径之RPATH与RUNPATH(小记)
GCC创建和使用静态链接库(.a文件)
Options for Linking
Creating and Using Dynamic Libraries ( C )
linux查看、添加、删除环境变量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY