LD_LIBRARY_PATH优先级

时间:2011-03-20 12:11:03

标签: linux operator-precedence dynamic-library

我刚刚发现了一些奇怪的行为:在我启动应用程序之前,我已将LD_LIBRARY_PATH设置为包含所有所需库的本地lib目录。启动后,我有部分(大部分)libs从LD_LIBRARY_PATH加载,但有一些是从标准/ usr / lib加载的(例如/usr/lib/libQtNetwork.so.4,/usr/lib/libSM.so。 6)。所有这些库都包含在LD_LIBRARY_PATH中列出的目录中。任何人都可以解释为什么我有这样的行为? 我对Linux世界不是很熟悉,但this article说我的方法应该有效

P.S。如果我将/ usr / libs重命名为其他东西,我将使用从我的libs位置使用的所有lib运行我的应用程序

提前感谢!

2 个答案:

答案 0 :(得分:3)

我找到了答案,答案是 RPATH 。所有Qt库都使用RPATH = $ QT_INSTALL_DIR构建,因此如果要在Linux中创建“bundle”,则应删除 RPATH 。可以通过调用chrpath命令删除 RPATH 。谢谢大家的帮助!

答案 1 :(得分: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 env变量。如果你有QT,如果安装了qmake的linux发行版将在路径中。如果您进行了自定义安装或编译,则需要设置路径。

祝你好运。