在 CentOS 7.2 上,我使用 g++ 4.8.5 构建了一个无法运行的应用程序,因为它找不到 确实存在 的库 runpath 。我很确定它在两周前有效。什么可能导致这种情况?

$ ./app
./app: error while loading shared libraries: libhdf5.so.9: cannot open shared object file: No such file or directory

$ ldd ./app | grep libhdf5
    libhdf5.so.9 => not found

$ readelf app -d | grep path
 0x000000000000001d (RUNPATH)            Library runpath: [/opt/ProductName/lib:/opt/ProductName/lib/private]

$ ll /opt/ProductName/lib/libhdf5.so*
lrwxrwxrwx. 1 fotechd fotechd      16 Oct 26 14:38 /opt/ProductName/lib/libhdf5.so -> libhdf5.so.9.0.0
lrwxrwxrwx. 1 fotechd fotechd      16 Oct 26 14:38 /opt/ProductName/lib/libhdf5.so.9 -> libhdf5.so.9.0.0
-rwxr-xr-x. 1 fotechd fotechd 3316074 Oct 26 14:35 /opt/ProductName/lib/libhdf5.so.9.0.0

设置 LD_LIBRARY_PATH 暂时修复它:
$ LD_LIBRARY_PATH=/opt/ProductName/lib ./app
...
OK

最佳答案

我已经能够在我这边解决这个问题。对我来说,这是因为 not found 库是一个间接库,而 runpath 实际上并没有解决间接依赖关系。我通过将附加的 rpath 链接器选项传递给编译器,使用 runpath 而不是 -Wl,--disable-new-dtags 修复了它。

这里有一个很好的详细解释:How to set RPATH and RUNPATH with GCC/LD?

关于shared-libraries - 为什么运行路径会被忽略?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53286707/

10-14 08:35