我有一个 Linux Qt 程序。我希望它优先使用可执行文件目录中的(动态)Qt 库(如果存在),否则使用系统的 Qt 库。 RPATH 来救援。
我将此行添加到qmake的 .pro 文件:
QMAKE_LFLAGS += '-Wl,-rpath,\'\$$ORIGIN\''
并查看生成的可执行文件readelf I see:
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
在应用程序目录中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)