MPI - 加载共享库时出错

Vig*_*ren 8 shared-libraries mpi linker-errors

我遇到的问题在这里得到了解决: 在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 %
Run Code Online (Sandbox Code Playgroud)

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

error while loading shared libraries: libmpi_cxx.so.1: 
cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

ran*_*man 8

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

export LD_LIBRARY_PATH=/PATH_TO_openmpi-version/lib:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

例如

export LD_LIBRARY_PATH=/usr/local/openmpi-1.8.1/lib:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

进入$HOME/.bashrc文件,然后再次将其发送到活动状态source $HOME/.bashrc.


Hri*_*iev 7

libdl,libm,librt,libnsllibutil都是必需的系统级库和他们来的非常基本的操作系统安装的一部分.libmpi并且libmpi_cxx是Open MPI安装的一部分,在您的情况下位于非标准位置,必须明确包含在链接器搜索路径中LD_LIBRARY_PATH.

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

-Wl,-rpath,/home/vigneshwaren/mpi/lib
Run Code Online (Sandbox Code Playgroud)

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

为了使相应的包装添加选项编译器选项的列表中,你将不得不修改mpiXX-wrapper-data.txt文件(其中XXcc,c++,CC,f90,等),位于mpi/share/openmpi/.例如,要mpicc传递选项,您必须修改/home/vigneshwaren/mpi/share/openmpi/mpicc-wrapper-data.txt并将以下内容添加到以以下内容开头的行linker_flags=:

linker_flags= ... -Wl,-rpath,${prefix}/lib
Run Code Online (Sandbox Code Playgroud)

${prefix} 包装器自动扩展到当前的Open MPI安装路径.