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 LinkingCreating and Using Dynamic Libraries ( C )linux查看、添加、删除环境变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值