ubuntu链接动态库的问题

动态库

在Linux动态库管理中,各组件的作用如下:

  1. 文件命名规则
libfoo.so.0.0.1  # 真实库文件(主版本.次版本.修订版本)
libfoo.so.0      # 主版本符号链接(对应soname)
libfoo.so        # 开发符号链接(编译链接时使用)
  1. 版本号意义
  • 主版本号:不兼容的API修改(当发生重大API变更时递增)
  • 次版本号:新增功能但保持向下兼容(当添加新功能但保持兼容时递增)
  • 修订版本:bug修复/性能优化(当进行向后兼容的改进时递增)
  1. 编译选项解析
-Wl,-rpath=/path/to/lib   # 将运行时库路径硬编码到可执行文件中
-L/path/to/lib            # 指定编译时的库搜索路径
-lfoo                     # 链接libfoo.so(实际查找的是libfoo.so的符号链接)
  1. 完整示例流程
# 1. 创建实际库文件
sudo cp libfoo.so.0.0.1 /usr/local/lib/

# 2. 创建版本符号链接
sudo ln -s /usr/local/lib/libfoo.so.0.0.1 /usr/local/lib/libfoo.so.0
sudo ln -s /usr/local/lib/libfoo.so.0 /usr/local/lib/libfoo.so

# 3. 更新动态链接器缓存
sudo ldconfig

# 4. 带rpath的编译命令
gcc main.c -Wl,-rpath=/usr/local/lib -L/usr/local/lib -lfoo -o app

# 5. 查看依赖关系
ldd app | grep libfoo
  1. 运行时路径优先级(从高到低):

  2. LD_LIBRARY_PATH 环境变量指定的路径

  3. -rpath 硬编码在可执行文件中的路径

  4. /etc/ld.so.conf 中配置的系统路径

  5. 默认系统路径(/lib, /usr/lib)

  6. 多版本管理技巧

# 同时保留两个版本
/usr/local/lib/
├── libfoo.so.0.0.1
├── libfoo.so.0 -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值