LD_LIBRARY_PATH优先级

6
我刚刚遇到了一些奇怪的行为:在启动我的应用程序之前,我已经将LD_LIBRARY_PATH设置为一个本地lib目录,其中包含所有所需的库。启动后,我有部分(大部分)库从LD_LIBRARY_PATH加载,但有些库从标准的/usr/lib(例如/usr/lib/libQtNetwork.so.4,/usr/lib/libSM.so.6)加载。所有这些库都包含在列在LD_LIBRARY_PATH中的目录中。有人能解释一下为什么会出现这种行为吗? 我对Linux世界不是很熟悉,但this article说我的方法应该可行。
附言:如果我将/usr/libs重命名为其他名称,我将使用从我的libs位置使用的所有库来运行我的应用程序。
提前感谢!

这个问题是http://www.superuser.com的一个很好的候选者。 - YasirA
1
特别是如果变量名已经固定,这在编程中非常重要。它是Linux上的LD_LIBRARY_PATH - Mat
谢谢,我已经更正了环境名称。这是帖子中的错误,而不是实际脚本中的错误。 - ixSci
你能展示一下你是如何启动应用程序以及设置LD_LIBRARY_PATH的吗? - Derick Schoonbee
2个回答

4
我已经找到了答案,答案是RPATH。所有Qt库都是使用RPATH=$QT_INSTALL_DIR构建的,所以如果你想在Linux中创建“bundle”,就应该删除RPATH。可以通过调用chrpath命令来删除RPATH。感谢大家的帮助!

我从来没有理解RPATH背后的原因。它总是似乎阻碍事情的进行。 - dietbuddha
1
@dietbuddha:应该在编译时告知应用程序在哪里搜索共享库,而不是依赖于环境变量。通常情况下,进行编译的人比运行程序的人更有技能,因此更清楚。这在许多用户登录并有专门团队负责的机器上尤其如此。但我理解,在小型半个人使用的机器上作为管理员和用户的感受可能会有所不同。 - Davide
谢谢您回答自己的问题。您帮了我很多。 - Ruslan

1

好的,看起来你正在使用Qt,但是相同的原则适用于所有编程语言,而不仅仅是Qt。

首先要查看的是你的PATH环境变量,然后是QTDIR,接着是LD_LIBRARY_PATH

通常情况下,你不需要“玩弄”LD_LIBRARY_PATH。如果你的PATH正确,那么应该没问题。

顺便提一下(你可能已经知道):要查看使用的库,可以使用ldd命令。例如:

user@host:~/$ ldd $QTDIR/bin/qmake 
linux-vdso.so.1 =>  (0x00007fff169ff000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fb6bf63e000)
libm.so.6 => /lib/libm.so.6 (0x00007fb6bf3bb000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fb6bf1a3000)
libc.so.6 => /lib/libc.so.6 (0x00007fb6bee20000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb6bf97e000)

假设您的QTDIR环境变量已设置。如果您在Linux发行版中安装了QT,则qmake将在路径中。如果您进行了自定义安装或编译,则需要设置路径。

祝你好运。


Derick,我需要玩一下LD_LIBRARY_PATH,因为我需要一个独立的“bundle”,它不依赖于底层系统(如VMWare Linux安装程序)。所以问题是:为什么LD_LIBRARY_PATH不能像应该的那样工作。LD_LIBRARY_PATH是否具有最高优先级或其他变量具有更高的优先级? - ixSci
好的,正如Yasir所建议的那样,SO可能不是正确的地方。(PS: 这里也可以看一下http://doc.qt.nokia.com/latest/deployment-x11.html。)回到重点:LD_LIBRARY_PATH应该具有优先权,但它被认为是一个hack。setuid或setgid可以改变行为。请参见[这里](http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/dlls.html)。你确定你的应用程序可以访问这个变量吗?你如何启动你的应用程序?ldd和`strace -o trace.txt ./ourprogram`的输出是什么? - Derick Schoonbee
我已经上传了启动脚本和所有输出内容,链接在这里:http://www.sendspace.com/file/pugplz。 - ixSci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接