MPI - 加载共享库时出错

时间:2013-02-08 09:39:19

标签: shared-libraries mpi linker-errors

我遇到的问题在这里得到了解决: Loading shared library in open-mpi/ mpi-run

当我的安装本身指定必要的-L参数时,我不知道如何设置LD_LIBRARY_PATH或指定-x LD_LIBRARY_PATH来解决问题。我的安装位于~/mpi/

我还包括了我的编译链接配置。

$ mpic++ -showme:version 
mpic++: Open MPI 1.6.3 (Language: C++)

$ mpic++ -showme
g++ -I/home/vigneshwaren/mpi/include -pthread -L/home/vigneshwaren/mpi/lib
-lmpi_cxx -lmpi -ldl -lm -Wl,--export-dynamic -lrt -lnsl -lutil -lm -ldl

$ mpic++ -showme:libdirs
/home/vigneshwaren/mpi/lib

$ mpic++ -showme:libs
mpi_cxx mpi dl m rt nsl util m dl    % Notice mpi_cxx here %

当我使用mpic++ <file>编译并使用mpirun a.out运行时,我收到了一个(共享库)链接器错误

error while loading shared libraries: libmpi_cxx.so.1: 
cannot open shared object file: No such file or directory

通过设置LD_LIBRARY_PATH修复了错误。问题是如何以及为什么?我错过了什么?当我的安装看起来很好时,为什么需要LD_LIBRARY_PATH

5 个答案:

答案 0 :(得分:7)

就我而言,我只是简单地追加

export LD_LIBRARY_PATH=/PATH_TO_openmpi-version/lib:$LD_LIBRARY_PATH

例如

export LD_LIBRARY_PATH=/usr/local/openmpi-1.8.1/lib:$LD_LIBRARY_PATH

进入$HOME/.bashrc文件,然后再次将其设为活动source $HOME/.bashrc

答案 1 :(得分:5)

libdllibmlibrtlibnsllibutil都是基本的系统级库,它们是非常基本的操作系统安装的一部分。 libmpilibmpi_cxx是Open MPI安装的一部分,在您的情况下位于非标准位置,必须明确包含在链接器搜索路径LD_LIBRARY_PATH中。

可以修改Open MPI编译器包装器的配置,并使它们将-rpath选项传递给链接器。 -rpath获取一个库路径并将其附加到一个列表中,该列表存储在可执行文件中,该列表告诉运行时链接编辑器(也就是动态链接器)在查询库LD_LIBRARY_PATH变量之前搜索库。例如,在您的情况下,以下选项就足够了:

-Wl,-rpath,/home/vigneshwaren/mpi/lib

这会将路径嵌入到可执行文件中的Open MPI库中,如果该路径在运行时是否为LD_LIBRARY_PATH的一部分,则无关紧要。

要使相应的包装器将该选项添加到编译器标志列表中,您必须修改mpiXX-wrapper-data.txt文件(其中XXccc++,位于CC的{​​{1}},f90等)。例如,要使mpi/share/openmpi/通过该选项,您必须修改mpicc并将以下内容添加到以/home/vigneshwaren/mpi/share/openmpi/mpicc-wrapper-data.txt开头的行中:

linker_flags=

linker_flags= ... -Wl,-rpath,${prefix}/lib 由包装器自动扩展到当前的Open MPI安装路径。

答案 2 :(得分:1)

我在Ubuntu上使用以下命令安装了 mpich 3.2

sudo apt-get install mpich

当我尝试使用 mpiexec 运行mpi进程时,出现了相同的错误。

/home/node1/examples/.libs/lt-cpi: error while loading shared libraries: libmpi.so.0: cannot open shared object file: No such file or directory

配置 LD_LIBRARY_PATH 不能解决我的问题。

我在机器上搜索了文件'libmpi.so.0',但找不到它。花了我一些时间弄清'libmpi.so.0'文件在我的计算机上的命名为'libmpi.so'。因此,我将其重命名为'libmpi.so.0'

它解决了我的问题!

如果遇到相同的问题,并且通过apt-get安装了该库,请执行以下操作。

文件'libmpi.so'应该位于位置'/ usr / lib / '。将文件重命名为'libmpi.so.0'

mv /usr/lib/libmpi.so /usr/lib/libmpi.so.0

之后, MPI 作业应该可以正常运行。

如果在'/ usr / lib'中找不到'libmpi.so',则可以使用以下命令获取其位置。

whereis libmpi.so

答案 3 :(得分:0)

首先,运行此命令

$ sudo apt-get install libcr-dev

如果仍然有这个问题,那么配置LD_LIBRARY_PATH如下:

export LD_LIBRARY_PATH=/usr/local/mpich-3.2.1/lib:$LD_LIBRARY_PATH

然后在此行之前将其添加到〜/ .bashrc:

[ -z "$PS1" ] && return

答案 4 :(得分:0)

只需运行

$ ldconfig

在我看来是解决问题的更好方法(摘自对this问题的评论)。特别是因为它避免了LD_LIBRARY_PATH环境变量的滥用。请参阅herehere,以了解为什么我认为它被滥用来解决当前的问题。