即使 -rpath 设置正确,也找不到共享库

Al *_*ndy 5 rpath ld

我正在构建一个第三方程序,该程序使用未设置的目录中的库/etc/ld.so.conf- 因此我将程序与-rpath选项链接。

运行objdump -x bin/GetHistPrices | grep -i path检查是否-rpath设置正确我得到确认它是好的:

RUNPATH 
   /application/FXCM-API/GetHistPrices/bin:
   /application/FXCM-API/lib:
   /application/FXCM-API/sample_tools/lib
Run Code Online (Sandbox Code Playgroud)

cmake将所有库复制到生成可执行文件的同一目录中 [eq ../GetHistPrices/bin]; 因此第一条路径是可以的。

更重要的是,最后 2 个路径也指向共享库所在的目录 - 这些-rpath选项由cmake脚本自动添加。

当我尝试运行该程序不是内部../GetHistPrices/bin/目录[所在] - EQ我不执行它./GetHistPrices-所以我得到这个错误信息:

bin/GetHistPrices:加载共享库时出错:

  libgsexpat.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

该程序仅在我从bin//application/FXCM-API/lib目录运行它时启动,因为所需的库位于那里。

1)
当我运行程序时,
LD_LIBRARY_PATH="/application/FXCM-API/GetHistPrices/bin" bin/GetHistPrices
它就会启动。但这也是我在可执行文件中看到的。奇怪的!

2)
添加/application/FXCM-API/GetHistPrices/bin/etc/ld.so.conf让启动程序以及成功。

操作系统是 SLES 12.3 - 老实说,不知何故,它在我看来就像系统中的一个错误。

我的问题:

我做错了什么,即使RUNPATH在可执行文件中正确设置它也不起作用。

小智 6

回答可能会晚,但可能对其他人有用。一些注意事项:

  1. 考虑rpathrunpath:您可以更改

-Wl,--禁用新dtags

  1. 如果您的库使用其他库作为依赖项,则必须单独设置它的rpath/runpath(在它的make过程中)。这是 LD_LIBRARY_PATH 和 rpath/runpath 之间的区别之一。
  2. 您可以使用 LD_DEBUG=libs ldd your_app/libyour_lib.so 检查 rpath/runpath 的搜索路径。