2016-05-18 118 views
2

我在路径/home/test/lib/libTest.so中有一个.so和一个名为myexec的可执行文件,它是用指向/home/test/lib/RPATH构建的。但是,当我在myexec上执行ldd时,它说libTest.so找不到,我不得不为export LD_LIBRARY_PATH工作。在可执行文件中找不到C++动态链接库

我已经证实:

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

有没有人知道为什么它不能找到图书馆没有设置LD_LIBRARY_PATH

+0

[MVCE](http://stackoverflow.com/help/mcve)需要, –

回答

1

here

在Linux中,环境变量LD_LIBRARY_PATH是一个冒号分隔的组的目录,其中库应该被搜索的第一,标准组目录

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

编辑1:

对于rpath,确保libTest.so不依赖于任何其他库。作为替代方案,你可以在GCC的替代-rpath使用-rpath-link选项,如图here

-rpath-LINK DIR

当使用ELF或SunOS中,一个共享库可能需要另一个。当ld -shared链接包含共享库作为其中一个输入文件时,会发生这种情况。当链接器在执行非共享的不可重定位链接时遇到这种依赖关系时,它会自动尝试查找所需的共享库并将其包含在链接中(如果未明确包含它)。在这种情况下,-rpath-link选项指定要搜索的第一组目录。

编辑2:

如果你想要更多的帮助,请提供:

  1. 精确参数编译
  2. 输出为ldd /path/to/binary命令
  3. 输出过程中用于readelf -d /path/to/binaryrpath
+1

这是否真的解决了这个问题? OP询问为什么当需要的路径已经构建到可执行文件中时,外部环境变量('LD_LIBRARY_PATH')是必需的。 – Spencer

+0

我承认答案并不令人满意。我刚刚编辑它请求更多信息。对于那个很抱歉。 –

相关问题