在可执行文件中找不到C ++动态链接库

时间:2016-05-18 04:17:55

标签: c++ c gcc shared-libraries rpath

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

我已确认:

  1. libTest.so确实存在于/home/test/lib/
  2. objdump -x myexec | grep RUNPATH表示/home/test/lib/内置于可执行文件中。
  3. 有没有人知道为什么在没有设置LD_LIBRARY_PATH的情况下无法找到库?

1 个答案:

答案 0 :(得分:2)

来自here

  

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

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

编辑1:

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

  

-rpath-link DIR

     

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

编辑2:

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

  1. 编译期间使用的rpath的精确参数
  2. ldd /path/to/binary命令的输出
  3. readelf -d /path/to/binary
  4. 的输出