【问题标题】:installed shared library version number does not match LT_VERSION_INFO安装的共享库版本号与 LT_VERSION_INFO 不匹配
【发布时间】:2015-12-19 08:40:56
【问题描述】:
共享库的 libtool 版本号通过 configure.ac 设置
LT_VERSION_INFO="lt_current:lt_revision:lt_age"
但是当我将其设置为0:1:0 make install 时,会安装lib..so.0.0.1,而当我将其设置为3:2:1 时,则会安装lib..so.2.1.2。这似乎不对。如果是,有人可以解释发生了什么吗?否则,可能有什么问题? libtool 版本为 2.4.2。
我熟悉 libtool 版本与发布版本不同的事实。这不是这里的问题。
【问题讨论】:
标签:
shared-libraries
gnu
autotools
libtool
【解决方案1】:
您可能会发现this explanation and example 很有用;网上还有其他类似的,但这个最后有一个实用的工作流程(就像 libtool 的文档一样)。因此,考虑到这一点,让我们来看看-version-info 的示例:
0:1:0
对libtool 说:对于 API 0,我对源文件进行了一项更改,并且没有对 API 进行向后兼容的添加。
现在libtool 将共享库构建过程从真正的平台工具中抽象出来,这样您就可以将一个 autotools 构建的 tarball 放到系统上并输入 ./configure && make && make install 并有合理的机会在最后运行软件建造。有些平台会关心-version-info 的内容(例如Linux,我有点假设您正在构建它,所以您会看到libfoo.so.0.0.1),而其他平台则不会(例如Android,所以您将见libfoo.so),还有其他人有点关心。由于libtool 必须跨越不同的平台,他们必须想出一个方案,让他们能够在所有他们的目标平台上计算正确的值。这就是编号有点不直观的原因。
所以在 Linux 上,“0:1:0”转换为 libfoo.so.0.0.1,因为链接器使用 major.minor.patchlevel 用于区分库的方案。在另一个操作系统上,这可能不同或不存在。
3:2:1
对libtool 说:对于 API 2,我对 API 进行了一项向后兼容的更改,以及随后的两项源代码更改。您通过 (current - age) = (3 - 1) = 2 获得 API 编号。您知道自 revision 以来您有后续更改在任何 API 更改时重置为 0(并且 current 会增加)。等等在 Linux 上,这意味着你会得到libfoo.so.2.1.2。