如何解决由于 Linux 中包含多个版本的库而发生的版本冲突



在我的项目中,我正在尝试使用两个已经编译和生成的库。让我们说 liba.so(我们自己的库在某个时候创建)和libssl.so.10。(它在Linux中可用)。

现在 liba.so 有依赖关系libcurl.so.3和libssl.so.10 具有依赖关系 libcurl.so.4(最新)

libcurl.so.3 和 libcurl.so.4 在系统中都可用。

因此,当我尝试在我的项目中同时使用它们时,我遇到了版本冲突。这是意料之中的吗?如果是,我该如何解决此问题?

有没有办法在不再次构建此库的情况下使用最新的 libcurl.so.4 修改 liba.so 依赖项?还是我需要使用最新的libcurl.so.4再次构建 liba.so?

感谢您的帮助

因此,当我尝试在我的项目中同时使用它们时,我遇到了版本冲突。这是意料之中的吗?如果是,我该如何解决此问题?

有两种解决方案。

首先,您将随身携带要使用的 libcurl.so 和 libssl.so 版本。然后,您将使用链接器的rpathLD_LIBRARY_PATH来确保加载包含的共享对象。

其次,您将构建针对libcurllibssl静态链接的liba.so

如果你在Android上工作,那么第二点是你的选择。这是因为 OpenSSL 包含在 Android 上,zygote 加载它,并且你总是在 zygote 的分支之后获得下层版本 0.9.8。

在Android上,如果你想要的只是一个像1.0.1这样的现代OpenSSL,你甚至需要构建一个包装器共享对象(这看起来很像你在libcurl.so.3libcurl.so.4中遇到的)。

最新更新