2

.so在路径中有/home/test/lib/libTest.so一个名为的可执行文件myexec,它是用RPATH指向/home/test/lib/. 但是,当我ldd执行 on时myexec,它libTest.so显示未找到,我必须这样做export LD_LIBRARY_PATH才能使其正常工作。

我已经确认:

  1. libTest.so确实存在于/home/test/lib/
  2. objdump -x myexec | grep RUNPATH确实表明/home/test/lib/内置在可执行文件中。

有谁知道为什么没有设置就找不到库LD_LIBRARY_PATH

4

1 回答 1

2

这里

在 Linux 中,环境变量 LD_LIBRARY_PATH 是一组以冒号分隔的目录,应首先在其中搜索库,然后是标准目录集

作为提示,您应该小心不要完全替换您的 LD_LIBRARY_PATH。它可能会弄乱系统共享库的路径。始终使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/path.

编辑1:

至于 ,请rpath确保它libTest.so不依赖于任何其他库。作为替代方案,您可以-rpath-link在 gcc 中使用 option 而不是-rpath,如下所示

-rpath-link 目录

使用 ELF 或 SunOS 时,一个共享库可能需要另一个。当 ld -shared 链接包含一个共享库作为输入文件之一时,就会发生这种情况。当链接器在做一个非共享的、不可重定位的链接时遇到这样的依赖时,它会自动尝试定位所需的共享库并将其包含在链接中,如果它没有显式包含的话。在这种情况下,-rpath-link 选项指定要搜索的第一组目录。

编辑2:

如果您需要更多帮助,请提供:

  1. rpath编译期间使用的确切参数
  2. ldd /path/to/binary命令的输出
  3. 输出为readelf -d /path/to/binary
于 2016-05-19T00:09:23.163 回答