如何在运行时删除LD_LIBRARY_PATH?

Kji*_*jir 10 c++ g++ autotools shared-libraries intel-ipp

我正在构建一个使用Intel的IPP库的C++应用程序.默认情况下,此库安装在/ opt中,并且要求您设置LD_LIBRARY_PATH编译和运行软件(如果选择共享库链接,我会这样做).我已经修改了我configure.ac/ Makefile.am我在编译时不需要设置该变量,但是我仍然无法在运行时找到共享库; 我怎么做?

我正在使用-Wl, -R/path/to/libdir标志进行编译g++

更新1:实际上我的二进制程序有一些正确链接的IPP库,但只有一个不是:

$ ldd myprogram
linux-vdso.so.1 =>  (0x00007fffa93ff000)
libippacem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippacem64t.so.6.0 (0x00007f22c2fa3000)
libippsem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippsem64t.so.6.0 (0x00007f22c2d20000)
libippcoreem64t.so.6.0 => /opt/intel/ipp/6.0.2.076/em64t/sharedlib/libippcoreem64t.so.6.0 (0x00007f22c2c14000)
[...]
libiomp5.so => not found
libiomp5.so => not found
libiomp5.so => not found
Run Code Online (Sandbox Code Playgroud)

当然图书馆在那里:

$ locate libiomp5.so
/opt/intel/ipp/6.0.2.076/em64t/sharedlib/libiomp5.so
Run Code Online (Sandbox Code Playgroud)

Cas*_*bel 5

通过/path/to/lib你的意思路径包含库,或路径的实际文件的目录?

-R给定目录参数的选项与-rpathld一样,这是您实际上在这里想要的选项。它将给定目录添加到运行时库搜索路径。只要您给它提供目录而不是文件名,它就应该起作用。我对此非常有信心,我自己做了,因为这是libtool给出的提示之一:

库已安装在:

/ path / to / library-directory

如果您碰巧要链接到给定目录LIBDIR中已安装的库,则必须使用libtool,并指定库的完整路径名,或在链接期间使用-LLIBDIR标志,并至少执行以下一项操作:以下:

  • 在执行期间将LIBDIR添加到“ LD_LIBRARY_PATH”环境变量
  • 在链接期间将LIBDIR添加到“ LD_RUN_PATH”环境变量中
  • 使用`-Wl,-rpath -Wl,LIBDIR'链接器标志
  • 让系统管理员将LIBDIR添加到`/etc/ld.so.conf'

(我将其粘贴在这里,因为可能更希望使用其他选项之一,例如LD_RUN_PATH可以节省对makefile的修改)


Kji*_*jir 2

正如 Richard Pennington 所建议的,缺少的库不是由我的应用程序直接使用的,而是由我使用的共享库使用的。由于我无法重新编译 IPP,因此问题的解决方案是在编译时添加-liomp5,使用链接器的 -R 选项。这实际上添加了 libiomp5.so 的 rpath 来解决问题!