在QMake中设置RPATH命令

我有一个Linux Qt程序。 如果它们存在,我希望它优先使用可执行文件目录中的(dynamic)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构造最终的LFLAGSvariables。 我无法弄清楚如何使它添加($ ORIGIN)在系统库之后。 有任何想法吗?

Solutions Collecting From Web of "在QMake中设置RPATH命令"

您可以将以下内容添加到.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的链接。

据我的研究可以说,你只能在QMake列表的开头添加RPATH。

但是,如果你在Linux上,可以安装chrpath ,你可以绕过这个方法。

将该块添加到.pro文件的末尾

 # Add spacing since chrpath cannot expand RPATH length QMAKE_RPATHDIR = \ /XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY1\ /XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY2\ /XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY3\ /XYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXY4 QMAKE_POST_LINK += 'chrpath -r \'/my/qt/installation:\$$ORIGIN\' $$OUT_PWD/mybinaryname;' 

我正在猜测发生了什么,但是它是基于了解ld的一些奇怪的行为。

检查在处理RUNPATH变量之前是否存在LD_LIBRARY_PATH变量。 由于同时存在RPATHRUNPATH ,所以LD_LIBRARY_PATH规则生效,所以如果设置了则取消设置。

其次,我永远不会期望看到:

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

ldd的输出中,我会经常看到$ORIGIN扩展到二进制文件的目录(也许你缩短了它),所以我会期待:

 libQt5Core.so.5 => /path/to/bin/./libQt5Core.so.5 (0x00007fb92aba9000) 

这意味着这听起来像LD_LIBRARY_PATH扩展是.:/usr/local/Trolltech/Qt-5.2.0/lib ,这对我来说听起来像你有环境覆盖发生。

qmake总是将QMAKE_RPATHDIR追加到$(QT_DIR)/mkspecs/features/qt.prf文件内部定义的QT_INSTALL_LIBS中:

 170: relative_qt_rpath:!isEmpty(QMAKE_REL_RPATH_BASE):contains(INSTALLS, target):\ 173: QMAKE_RPATHDIR += $$relative_path($$[QT_INSTALL_LIBS], $$qtRelativeRPathBase()) 175: QMAKE_RPATHDIR += $$[QT_INSTALL_LIBS/dev] 179:!isEmpty(QMAKE_LFLAGS_RPATHLINK):!contains(QT_CONFIG, static) { 189: QMAKE_RPATHLINKDIR *= $$unique(rpaths) 

所以为了避免你的应用程序在系统路径中使用QT ,注释掉上面附加QMAKE_RPATHDIR的行,并在你的.pro文件中添加QMAKE_RPATHDIR=$ORIGIN