【问题标题】:MPI - error loading shared librariesMPI - 加载共享库时出错
【发布时间】:2013-01-24 01:02:43
【问题描述】:

我遇到的问题已经在这里解决了: 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

【问题讨论】:

    标签: shared-libraries mpi linker-errors


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      简单运行

      $ ldconfig
      

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

      【讨论】:

      • 这对系统范围的安装有效,并且需要配置 root 访问权限。这不适用于非 root 用户和/或安装多个版本时。
      【解决方案3】:

      首先,运行这个命令

      $ 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】:

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

        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

        【讨论】:

        • 要找到它(例如在大型集群上)使用whereis openmpi。为我工作。
        【解决方案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++CCf90、等),位于mpi/share/openmpi/。例如,要使mpicc 通过该选项,您必须修改/home/vigneshwaren/mpi/share/openmpi/mpicc-wrapper-data.txt 并将以下内容添加到以linker_flags= 开头的行:

        linker_flags= ... -Wl,-rpath,${prefix}/lib
        

        ${prefix} 被包装器自动扩展为当前的 Open MPI 安装路径。

        【讨论】:

        • 确保您的 LD_LIBRARY_PATH 不会像我的 CUDA 那样在您的 .bashrc 中被过度使用。你想要export LD_LIBRARY_PATH=/lib64/openmpi/lib:$LD_LIBRARY_PATH
        猜你喜欢
        • 2011-05-29
        • 2017-11-05
        • 2014-12-09
        • 2022-01-04
        • 2016-10-26
        相关资源
        最近更新 更多