在分发api库时,对.so版本和链接策略感到困惑
Confused about .so version and linking strategy when distributing a api library
我们已经将Java API移植到C++,并为Linux创建了一个库文件(.a文件)。我们的API依赖于boost框架,也依赖于log4cxx。(我们与第一位用户讨论过这一点,他们对这些依赖关系很满意)。
当我编译一个使用库文件的示例应用程序时,它会链接依赖项的.so文件(libboostrongystem.so、libboost_thread.so和liblog4cxx.so)。当应用程序运行时,它需要为每个.so文件找到特定版本的文件名,例如liblog4cxxx.so.10。
如果用户正在使用更新版本的boost(例如),他/她是否能够链接到他们的本地版本并使用该更新版本运行(假设bacwards兼容)?是否有其他方法来处理类似的版本/依赖项(即,您是否尝试在外部引用库中链接到自己的库)?
是的,程序可以链接到具有兼容接口的较新库。文件名中的数字对库应用程序二进制接口(ABI)进行编码。
FreeBSD的手册提供了更多关于库版本控制的信息。基本规则是:
- 从1.0开始
- 如果有向后兼容的更改,则更改次要编号(注意ELF系统忽略次要编号)
- 如果存在不兼容的更改,请更改主要编号
链接器将整理详细信息,以便使用具有兼容接口的最新库版本。这里还有更多关于stackoverflow的信息。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 下面是我为检测链接列表中的循环而制作的代码
- 有了gcc,是否可以链接库,但前提是它存在
- 使用C链接在函数内部创建C++模板
- Visual Studio mkl_link_tool.exe链接错误
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 在分发api库时,对.so版本和链接策略感到困惑