如何在 Linux 中存储不同编译的相同库版本?

Posted

技术标签:

【中文标题】如何在 Linux 中存储不同编译的相同库版本?【英文标题】:How to store same library version compiled differently in Linux? 【发布时间】:2015-12-02 11:53:29 【问题描述】:

我有两个不同的 Qt 项目,其中一个需要用 Qt 4.8 编译,另一个需要用 Qt 5.4 编译。两者都需要使用根据其版本编译的库 QDeviceWatcher(即 Qt 5 下的应用程序应该为 Qt 5 编译 QDeviceWatcher,使用 Qt 4.8 的应用程序需要使用 Qt 4.8 编译的 QDeviceWatcher)。

问题在于,在 Linux 下,.so 库文件应该位于同一个“全局”文件夹 /usr/local/lib。由于我正在处理这两个项目,因此我必须将两组 .so 文件都放在该文件夹中 - 鉴于它们具有相同的名称并且最后添加的文件只会覆盖前一个文件,这是不可能的。

至于现在我所做的是每次更改要编译的项目时,我都会用我需要的编译来更新库文件,但这显然是不可取的。

有没有办法解决这个问题?

我遇到的唯一两种方法是创建一个虚假的新版本库(目前是 2.0.0,所以我可以创建 2.0.1 版本)并为一个不同的 Qt 版本编译每个库版本(但当然那会很乱,我的意思是,这是一个假的版本!)或者将 .so 文件定位在靠近项目的目录中,这样文件就会在那里而不是全局目录 /usr/local/lib 中得到照顾。但是,在我看来,这打破了让库在全球范围内可用于所有新应用程序的整个想法。而谷歌并没有帮助我。

【问题讨论】:

您能否提供有关导致您出现问题的库文件名的具体信息?在我的机器上,Qt4 和 Qt5 库有不同的名称,所以如果我想链接到 Qt 的第 4 版,我使用-lQtCore,而对于第 5 版,我使用-lQt5Core。请注意,您的 .so 文件应该是指向特定版本的符号链接,因此如果您的 Qt4 和 Qt5 库的名称相同,则可能只是在编译/链接期间出现问题 - 一旦链接,可执行文件应该链接到正确的版本。 @nos 看来您误解了我的问题:它不在 Qt 库之间,而是在使用不同 Qt 版本编译的 QDeviceWatcher 库之间。 那么 QDeviceWatcher .so 文件应该有不同的名称,具体取决于它是按照许多外部 Qt 库的惯例编译为 Qt 4 还是 Qt5 - 但由于该库不是构建的您需要将它们放在不同的目录中,一个用于 Qt4,一个用于 Qt5,并指示您的应用程序在匹配目录中查找库 - 或者让某人更新 QDeviceWatcher 的构建系统以生成不同的库名称。 【参考方案1】:

鉴于QDeviceWatcher 是第3 方应用程序,我要做的是将它安装在/usr/local/lib 文件夹之外并安装到项目目录中,然后更新我的.pro 以直接指向它。

【讨论】:

以上是关于如何在 Linux 中存储不同编译的相同库版本?的主要内容,如果未能解决你的问题,请参考以下文章

windows下jar无法在linux下运行

相同的源代码,不同的可执行文件大小?

linux下查看动态链接库so文件的依赖的相关组建

C++ 两个库依赖于相同的库但不同的版本?

如何处理具有完全不同构建系统的第三方库?

为特定 Linux 风格预编译 R 包