【问题标题】:LD_LIBRARY_PATH precedenceLD_LIBRARY_PATH 优先级
【发布时间】:2011-03-20 12:11:02
【问题描述】:

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

附:如果我将 /usr/libs 重命名为其他名称,我的应用程序将使用从我的库位置使用的所有库运行

提前致谢!

【问题讨论】:

  • 这个问题适合superuser.com
  • 确实如此,尤其是在变量名固定的情况下。它在 Linux 上是 LD_LIBRARY_PATH
  • 谢谢,我已经更正了环境名称。这是帖子中的错误,而不是实际脚本中的错误。
  • 您能告诉我们您是如何启动您的应用程序以及您是如何设置 LD_LIBRARY_PATH 的吗?

标签: linux operator-precedence dynamic-library


【解决方案1】:

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

【讨论】:

  • 我一直不明白 RPATH 背后的原因。它似乎总是碍事。
  • @dietbuddha:应该在编译时告诉应用程序在哪里搜索它的共享库;它不应该依赖环境变量。很多时候,编译的人比运行程序的人更熟练,因此知道得更好。在许多用户登录的机器上尤其如此,并且有一个专门的团队来处理它。但我知道,作为小型半个人机器的管理员和用户,感觉可能会有所不同
  • 感谢您回答自己的问题。你帮了我很多。
【解决方案2】:

好的,看来您正在使用 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 环境变量已设置。如果你有 QT 如果安装了 qmake 的 linux 发行版将在路径中。如果您进行了自定义安装或编译,则需要设置路径。

祝你好运。

【讨论】:

  • Derick,我需要使用 LD_LIBRARY_PATH,因为我需要独立的“捆绑包”,它不依赖于底层系统(如 VMWare Linux 安装程序)。所以问题是:为什么 LD_LIBRARY_PATH 不能正常工作。 LD_LIBRARY_PATH 的优先级最高还是其他变量的优先级更高?
  • 好的,所以可能不像 Yasir 建议的那样是正确的地方。 (PS:也可以在这里查看doc.qt.nokia.com/latest/deployment-x11.html.)回到正题:LD_LIBRARY_PATH 应该有优先权,但它被认为是 hack。 setuid 或 setgid 可以改变行为。见here。您确定您的应用程序可以访问此变量吗?你如何启动你的应用程序? ldd 和strace -o trace.txt ./ourprogram 的输出是什么?
  • 我已经上传了启动脚本和所有输出:sendspace.com/file/pugplz
猜你喜欢
  • 2012-07-24
  • 2011-06-25
  • 1970-01-01
  • 2011-12-20
  • 2014-12-01
  • 2023-03-12
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多