2

我有一个我开发的库 A。当我在机器上部署它时,对应的libA.solibA-XYZso被放入 /usr/lib (XYZ 是版本号)。

现在我开发了一个库 B,它使用 A。当我链接 B 时,我使用标志 -lA。然后“ ldd libB.so ”给了我:

(...)
libA-X.Y.Z.so => /usr/lib/libA-X.Y.Z.so
(...)

我的问题是,当我发布新版本的 A (XYZZ) 时,我还必须发布新版本的 B。否则,安装最新 A 的人将无法安装 B,而 B 将寻找 XYZ 版本这不存在。

我该如何解决这个问题?我如何告诉 B 寻找 libA.so 而不是 libA-XYZso ?或者这样做是错误的?甚至不安全?

更新 1:库 A(我从别人那里继承的)使用自动工具。

更新 2:当我构建库 A 时,我可以看到:"-Wl,-soname -Wl,libA-0.6.1.so"。如果我理解正确,这意味着我们将 soname 强制为libA-0.6.1.so。是对的吗 ?现在我的问题是我不知道如何在使用自动工具的项目中修改这种行为。我用谷歌搜索了一段时间,但找不到任何有用的信息。我应该修改 configure.in 还是 Makefile.am ?

4

3 回答 3

5

创建 libA.so 时,将 -soname 选项传递给链接器(如果通过 gcc 链接,请使用 -Wl,-soname)。然后,当 B 被链接时,链接器通过它的 soname 引用 A,而不是通过它的文件名。在目标系统上,确保您有从 soname 到真实文件的链接。看

http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html

于 2008-10-31T10:04:36.827 回答
0

这在 Windows 中也可以作为“DLL 地狱”使用 :)。

如果 B 需要 A 的特定版本,并且您将链接到 libA 而不是 libA-XYZ,则仅将 libA 替换为较新版本可能会导致 B 无法加载或崩溃。

但是当然你可以做一个从 libA-XYZ 到 libA-X1.Y1.Z1 的符号链接。如果没有更改 API 并且只有实现,那么您应该是安全的。

于 2008-10-31T07:59:18.250 回答
0

回答我的第二次更新:在 libA 的 Makefile.am 中,我将 _la_LDFLAGS 从-release修改为-avoid-version。这创建了一个没有版本号的共享库,然后我重新编译了 libB,它成功地链接到了这个未版本化的共享库。

于 2008-10-31T14:21:43.950 回答