linux - 在 QMake 中设置 RPATH 顺序

标签 linux qt qmake rpath

我有一个 Linux Qt 程序。我希望它优先使用可执行文件目录中的(动态)Qt 库(如果存在),否则使用系统的 Qt 库。 RPATH 进行救援。

我将这一行添加到 qmake 的 .pro 文件中:

QMAKE_LFLAGS    += '-Wl,-rpath,\'\$$ORIGIN\''

并使用 readelf 查看生成的可执行文件,我看到:

0x000000000000000f (RPATH)              Library rpath: [$ORIGIN:/usr/local/Trolltech/Qt-5.2.0/lib]
0x000000000000001d (RUNPATH)            Library runpath: [$ORIGIN:/usr/local/Trolltech/Qt-5.2.0/lib]

似乎是对的,但是ldd显示使用的是系统版本:

libQt5Core.so.5 => /usr/local/Trolltech/Qt-5.2.0/lib/libQt5Core.so.5 (0x00007f2d2fe09000)

如果我手动编辑 qmake 生成的 Makefile 以交换两个 rpath 的顺序,那么 $ORIGIN 出现在/usr/local/... 之后,我得到正确的行为:

0x000000000000000f (RPATH)              Library rpath: [/usr/local/Trolltech/Qt-5.2.0/lib:$ORIGIN]
0x000000000000001d (RUNPATH)            Library runpath: [/usr/local/Trolltech/Qt-5.2.0/lib:$ORIGIN]

libQt5Core.so.5 => ./libQt5Core.so.5 (0x00007fb92aba9000)

我的问题是 qmake 如何构建最终的 LFLAGS 变量。我无法弄清楚如何让它在系统库之后添加我的加法($ORIGIN)。有什么想法吗?

最佳答案

您可以将以下内容添加到您的 .pro 文件中,以强制动态链接器在 Linux 运行时在与您的 Qt 应用程序相同的目录中查找:

unix:{
    # suppress the default RPATH if you wish
    QMAKE_LFLAGS_RPATH=
    # add your own with quoting gyrations to make sure $ORIGIN gets to the command line unexpanded
    QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN\'"
}

如果你想让它在可执行路径的子目录中查找,你可以使用:

QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN/libs\'"

请注意,您的应用程序目录中应该有同名的 .so 文件。例如,您应该将 libQt5Core.so.5.2.0 复制到名为 libQt5Core.so.5 的应用程序目录。现在 ldd 显示了应用程序的目录。

您还可以在应用程序目录中拥有 libQt5Core.so.5.2.0 和指向它的名称为 libQt5Core.so.5 的链接。

关于linux - 在 QMake 中设置 RPATH 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27384406/

相关文章:

为 JNI 链接 C 包装器后的 java.lang.UnsatisfiedLinkError

c++ - 我想在qt中创建一个自定义标题栏

c++ - qmake - QMAKE_RPATHDIR 不起作用

c++ - qt-5.8编译qtwebkit的方法

qt - 在 qmake 的 Makefile 中添加额外的变量

php - 在文件夹中的所有 PHP 文件中用新词替换所有包含特定词的行

linux - 切割部分绳子

c++ - 动态创建自定义小部件的新实例并连接信号和插槽 (Qt)

java - 记录测试驱动开发的网络流量

qt - 如何从 QT 中的 RTSP 流解析 ONVIF 元数据?