编辑:我解决了这个问题,解决方案如下。

我正在专用于科学计算的共享计算集群中构建代码,因此我只能控制主文件夹中的文件。尽管我以fftw为例,但我想了解具体原因,为什么我尝试设置LD_LIBRARY_PATH无效。

我像这样在我的主文件夹中构建fftw和fftw_mpi库

./configure --prefix=$HOME/install/fftw --enable-mpi --enable-shared
make install

它构建良好,但是在install/fftw/lib中,我发现新构建的libfftw3_mpi.so链接到错误版本的fftw库。
$ ldd libfftw3_mpi.so |grep fftw
  libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f7df0979000)

如果我现在尝试将LD_LIBRARY_PATH设置为正确指向此目录,它仍然会选择错误的库:
$ export LD_LIBRARY_PATH=$HOME/install/fftw/lib
$ ldd libfftw3_mpi.so |grep fftw
    libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f32b4794000)

仅当我明确使用LD_PRELOAD时,我才能覆盖此行为。我不认为LD_PRELOAD是合适的解决方案。
$ export LD_PRELOAD=$HOME/install/fftw/lib/libfftw3.so.3
$ ldd libfftw3_mpi.so |grep fftw
   $HOME/install/fftw/lib/libfftw3.so.3 (0x00007f5ca3d14000)

这是我所期望的,是在Ubuntu桌面上完成的一个小测试,我先将fftw安装到/usr/lib,然后用LD_LIBRARY_PATH覆盖此搜索路径。
$ export LD_LIBRARY_PATH=
$ ldd q0test_mpi |grep fftw3
    libfftw3.so.3 => /usr/lib/x86_64-linux-gnu/libfftw3.so.3
$ export LD_LIBRARY_PATH=$HOME/install/fftw-3.3.4/lib
$ ldd q0test_mpi |grep fftw3
    libfftw3.so.3 => $HOME/install/fftw-3.3.4/lib/libfftw3.so.3

简而言之:为什么libfft3_mpi库仍然找到错误的动态fftw3库?该搜索路径在哪里以比LD_LIBARY_PATH优先的方式硬编码?为什么在另一台计算机上不是这种情况?

如果这很重要,我正在使用英特尔编译器13.1.2,mkl 11.0.4.183和openmpi 1.6.2。

编辑:感谢所有的答案。在这些帮助下,我们能够将问题隔离到RPATH,并且从那里开始,集群支持能够找出问题所在。我接受了第一个答案,但是两个答案都很好。

之所以这么难找出原因,是因为我们不知道编译器实际上是包装器脚本,从而在编译器命令行中添加了一些内容。以下是支持小组回复的一部分:

最佳答案

http://man7.org/linux/man-pages/man8/ld.so.8.html



带有readelf readelf -d libfftw3_mpi.so

  • ,您可以检查您的lib是否在动态部分中包含此类属性。
  • export LD_DEBUG=libs可以调试用于查找库的搜索路径
  • chrpath -r<new_path> <executable>的rpath可以更改
  • 关于linux - 为什么我不能使用LD_LIBRARY_PATH覆盖动态库的搜索路径?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33519640/

    10-11 18:10