文件目录结构
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查看、添加、删除环境变量
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容