我在路径.so
中有一个/home/test/lib/libTest.so
,而myexec
的可执行文件是RPATH
指向/home/test/lib/
。但是,当我在ldd
上myexec
时,它显示libTest.so
未找到,我必须export LD_LIBRARY_PATH
才能使其正常工作。
我已确认:
libTest.so
确实存在于/home/test/lib/
objdump -x myexec | grep RUNPATH
表示/home/test/lib/
内置于可执行文件中。有没有人知道为什么在没有设置LD_LIBRARY_PATH
的情况下无法找到库?
答案 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:
如果您需要更多帮助,请提供:
rpath
的精确参数ldd /path/to/binary
命令的输出readelf -d /path/to/binary