编辑:我已解决此问题,解决方案如下。
我正在构建一个用于科学计算的共享计算集群中的代码,因此我只能控制我的主目录中的文件。尽管我使用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_LIBRARY_PATH更优先?为什么另一台计算机上情况不是这样?我正在使用intel编译器13.1.2、mkl 11.0.4.183和openmpi 1.6.2,如果有关系的话。
编辑:感谢所有答案。在这些帮助下,我们能够将问题隔离到RPATH,并从那里,群集支持能够找出问题所在。我接受了第一个答案,但两个答案都很好。
之所以这么难以解决,是因为我们并不知道编译器实际上是包装脚本,会向编译器命令行添加内容。这里是支持回复的一部分:
[The] compilation goes through our compiler wrapper. We do RPATH-ing by default as it helps most users in correctly running their jobs without loading LD-LIBRARY_PATH etc. However we exclude certain library paths from default RPATH which includes /lib, /lib64 /proj /home etc. Earlier the /usr/lib64 was not excluded by mistake (mostly). Now we have added that path in the exclusion list.
--disable-rpath
配置标志。要更改rpath,可以使用chrpath -r<new_path> <executable>
来更改库中的rpath。 - Martin Bonetti