安装的共享库版本号不匹配 LT_VERSION_INFO

installed shared library version number does not match LT_VERSION_INFO

共享库的 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 版本与发布版本不同这一事实。这不是这里的问题。

您可能会发现 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 用于区分库的方案。在另一个 OS 上,这可能不同,或者不存在。

3:2:1

libtool 说:对于 API 2,我对 API 进行了一项向后兼容的更改,随后进行了两项源代码更改。您通过 (current - age) = (3 - 1) = 2 获得 API 号码。您知道您有后续自 revision 在任何 API 更改时重置为 0 以来的更改(并且 current 递增)。依此类推 Linux 这意味着您得到 libfoo.so.2.1.2.