在分发api库时,对.so版本和链接策略感到困惑

Confused about .so version and linking strategy when distributing a api library

本文关键字:策略 链接 版本 so api 库时      更新时间:2023-10-16

我们已经将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的信息。