Mik*_*ell 9 linux qt qmake rpath
我有一个Linux Qt程序.我希望它优先使用可执行文件目录中的(动态)Qt库(如果存在),否则使用系统的Qt库.RPATH来救援.
我将此行添加到qmake的.pro文件中:
QMAKE_LFLAGS += '-Wl,-rpath,\'\$$ORIGIN\''
Run Code Online (Sandbox Code Playgroud)
用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]
Run Code Online (Sandbox Code Playgroud)
似乎没错,但ldd显示它使用的是系统版本:
libQt5Core.so.5 => /usr/local/Trolltech/Qt-5.2.0/lib/libQt5Core.so.5 (0x00007f2d2fe09000)
Run Code Online (Sandbox Code Playgroud)
如果我手动编辑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)
Run Code Online (Sandbox Code Playgroud)
我的问题是qmake如何构造最终的LFLAGS变量.我无法弄清楚如何使它在系统库之后添加($ ORIGIN).有任何想法吗?
Nej*_*jat 12
您可以将以下内容添加到.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\'"
}
Run Code Online (Sandbox Code Playgroud)
如果您希望它查看可执行路径的子目录,您可以使用:
QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN/libs\'"
Run Code Online (Sandbox Code Playgroud)
请注意,您的应用程序目录中应该具有完全相同名称的.so文件.例如,您应该libQt5Core.so.5.2.0使用名称复制到您的应用程序目录libQt5Core.so.5.现在ldd显示了应用程序的目录.
您还可以libQt5Core.so.5.2.0使用libQt5Core.so.5应用程序目录中的名称和链接.
我对正在发生的事情进行了一些猜测,但这是基于了解 ld 的一些奇怪行为。
检查是否存在LD_LIBRARY_PATH将在处理 RUNPATH 变量之前生效的变量。由于RPATH和 的存在RUNPATH,该LD_LIBRARY_PATH规则生效,因此如果已设置,则取消设置。
其次,我没想到会看到:
libQt5Core.so.5 => ./libQt5Core.so.5 (0x00007fb92aba9000)
Run Code Online (Sandbox Code Playgroud)
在 的输出中ldd,我总是会看到 扩展$ORIGIN到二进制文件的目录(也许您缩短了它?),所以我期望:
libQt5Core.so.5 => /path/to/bin/./libQt5Core.so.5 (0x00007fb92aba9000)
Run Code Online (Sandbox Code Playgroud)
这意味着它听起来像是LD_LIBRARY_PATH扩展.:/usr/local/Trolltech/Qt-5.2.0/lib,对我来说,这听起来像是你已经发生了环境覆盖。
| 归档时间: |
|
| 查看次数: |
8618 次 |
| 最近记录: |