动态库
在Linux动态库管理中,各组件的作用如下:
- 文件命名规则:
libfoo.so.0.0.1 # 真实库文件(主版本.次版本.修订版本)
libfoo.so.0 # 主版本符号链接(对应soname)
libfoo.so # 开发符号链接(编译链接时使用)
- 版本号意义:
- 主版本号:不兼容的API修改(当发生重大API变更时递增)
- 次版本号:新增功能但保持向下兼容(当添加新功能但保持兼容时递增)
- 修订版本:bug修复/性能优化(当进行向后兼容的改进时递增)
- 编译选项解析:
-Wl,-rpath=/path/to/lib # 将运行时库路径硬编码到可执行文件中
-L/path/to/lib # 指定编译时的库搜索路径
-lfoo # 链接libfoo.so(实际查找的是libfoo.so的符号链接)
- 完整示例流程:
# 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
-
运行时路径优先级(从高到低):
-
LD_LIBRARY_PATH
环境变量指定的路径 -
-rpath
硬编码在可执行文件中的路径 -
/etc/ld.so.conf
中配置的系统路径 -
默认系统路径(/lib, /usr/lib)
-
多版本管理技巧:
# 同时保留两个版本
/usr/local/lib/
├── libfoo.so.0.0.1
├── libfoo.so.0 -