编辑:我解决了这个问题,解决方案如下.
我正在专用于科学计算的共享计算集群中构建代码,因此我只能控制主文件夹中的文件.虽然我使用fftw作为示例,但我想了解具体原因,为什么我尝试设置LD_LIBRARY_PATH不起作用.
我在我的主文件夹中构建了fftw和fftw_mpi库
./configure --prefix=$HOME/install/fftw --enable-mpi --enable-shared
make install
Run Code Online (Sandbox Code Playgroud)
它构建正常,但在install/fftw/lib中,我发现新构建的libfftw3_mpi.so链接到错误版本的fftw库.
$ ldd libfftw3_mpi.so |grep fftw
libfftw3.so.3 => /usr/lib64/libfftw3.so.3 (0x00007f7df0979000)
Run Code Online (Sandbox Code Playgroud)
如果我现在尝试将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)
Run Code Online (Sandbox Code Playgroud)
只有我明确使用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)
Run Code Online (Sandbox Code Playgroud)
这是我期望的,在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
Run Code Online (Sandbox Code Playgroud)
简而言之:为什么libfft3_mpi库仍然找到错误的动态fftw3库?此搜索路径在何处以这样的方式进行硬编码,使其优先于LD_LIBARY_PATH?为什么在另一台计算机上不是这种情况?
如果这很重要,我正在使用英特尔编译器13.1.2,mkl 11.0.4.183和openmpi 1.6.2.
编辑:谢谢你的所有答案.在这些帮助下,我们能够将问题隔离到RPATH,从那里,集群支持能够找出问题所在.我接受了第一个答案,但两个答案都很好.
之所以这么难以理解,原因是我们不知道编译器实际上是包装脚本,而是向编译器命令行添加内容.这是支持部门的回复的一部分:
[编译]通过我们的编译器包装器进行编译.我们默认执行RPATH,因为它可以帮助大多数用户正确运行他们的作业而不加载LD-LIBRARY_PATH等.但是我们从默认的RPATH中排除某些库路径,包括/ lib,/ lib64/proj/home等./ usr之前错误地(大多数情况下)没有排除/ lib64.现在我们在排除列表中添加了该路径.