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

时间:2014-02-26 04:08:41

标签: linux openssl shared-libraries libcurl ldd

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

现在liba.so具有依赖性libcurl.so.3& libssl.so.10具有依赖性libcurl.so.4(最新)

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

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

有没有办法修改liba.so与最新libcurl.so.4的依赖关系而不再建立这个库? 或者我是否需要使用最新的libcurl.so.4再次构建liba.so?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

  

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

有两种解决方案。

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

其次,您将构建liba.so以静态链接libcurllibssl

如果您使用的是Android,则可以选择第二位。那是因为OpenSSL包含在Android上,zygote会加载它,而你在zygote的分支后总是得到0.9.8的低级版本。

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