我有一个我开发的库A.当我在机器上部署它时,相应的 libA.so libA-X.Y.Z.so 放在/ usr / lib(X.Y.Z是版本号)中。

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

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

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

我该如何解决这个问题?如何告诉B查找libA.so而不是libA-X.Y.Z.so?或者这样做是不对的?甚至不安全?

更新1 :库A(我从其他人那里继承)使用autotools。

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

有帮助吗?

解决方案

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

http://www.linux。组织/文档/ LDP / HOWTO /编程库-HOWTO /共享libraries.html

其他提示

这在Windows中也适用于“DLL hell”。 :)

如果B需要特定版本的A并且您将链接到libA而不是libA-X.Y.Z,那么只使用较新版本的libA替换可能导致B无法加载或崩溃。

但是当然你可以从libA-X.Y.Z到libA-X1.Y1.Z1做一个符号链接。如果没有API发生变化,只有你的实现应该是安全的。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top