编译 openmpi 代码时“找不到 -lmpi*”

编译 openmpi 代码时“找不到 -lmpi*”

我曾尝试在 Ubuntu 14.04 服务器上从源代码安装 openmpi 1.8.1。我想在具有多核的单台机器上使用 mpi 进行大规模计算。

简单的“Hello world”测试可以毫无问题地运行。

然而,当我尝试编译我需要使用的程序时,出现了以下错误:

/usr/bin/ld: cannot find -lmpi_usempi 
/usr/bin/ld: cannot find -lmpi_mpifh 
/usr/bin/ld: cannot find -lmpi
collect2: error: ld returned 1 exit status
make: *** [mcp2_mpi] Error 1

我曾尝试将 LD_LIBRAY_PATH 设置为可以找到 openmpi lib 的目录。似乎不起作用。我曾尝试在详细模式下检查 ld 命令。

$ ld -lmpi_usempi --verbose
attempt to open /usr/x86_64-linux-gnu/lib64/libmpi_usempi.so failed
attempt to open /usr/x86_64-linux-gnu/lib64/libmpi_usempi.a failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libmpi_usempi.so failed
attempt to open //usr/local/lib/x86_64-linux-gnu/libmpi_usempi.a failed
attempt to open //usr/local/lib64/libmpi_usempi.so failed
attempt to open //usr/local/lib64/libmpi_usempi.a failed
attempt to open //lib/x86_64-linux-gnu/libmpi_usempi.so failed
attempt to open //lib/x86_64-linux-gnu/libmpi_usempi.a failed
attempt to open //lib64/libmpi_usempi.so failed
attempt to open //lib64/libmpi_usempi.a failed
attempt to open //usr/lib/x86_64-linux-gnu/libmpi_usempi.so failed
attempt to open //usr/lib/x86_64-linux-gnu/libmpi_usempi.a failed
attempt to open //usr/lib64/libmpi_usempi.so failed
attempt to open //usr/lib64/libmpi_usempi.a failed
attempt to open //usr/local/lib/libmpi_usempi.so failed
attempt to open //usr/local/lib/libmpi_usempi.a failed
attempt to open //lib/libmpi_usempi.so failed
attempt to open //lib/libmpi_usempi.a failed
attempt to open //usr/lib/libmpi_usempi.so failed
attempt to open //usr/lib/libmpi_usempi.a failed
ld: cannot find -lmpi_usempi

ld 似乎没有在 LD_LIBRARY_PATH 中查找库。我曾尝试在 /etc/ld.so.conf.d/ 中创建一个文件以包含 openmpi lib 的路径。然后命令sudo ldconfig-v.我发现以下输出:

    /usr/local/openmpi/lib:
    libopen-rte.so.7 -> libopen-rte.so.7.0.3
    libmpi_mpifh.so.2 -> libmpi_mpifh.so.2.3.0
    libopen-trace-format.so.1 -> libopen-trace-format.so.1.0.0
    libmpi_cxx.so.1 -> libmpi_cxx.so.1.1.3
    liboshmem.so.1 -> liboshmem.so.1.0.0
    libvt-mpi.so.0 -> libvt-mpi.so.0.0.0
    libvt-hyb.so.0 -> libvt-hyb.so.0.0.0
    libvt-mt.so.0 -> libvt-mt.so.0.0.0
    libotfaux.so.0 -> libotfaux.so.0.0.0
    libvt-mpi-unify.so.0 -> libvt-mpi-unify.so.0.0.0
    libopen-pal.so.6 -> libopen-pal.so.6.1.1
    libmpi_usempi.so.1 -> libmpi_usempi.so.1.3.0
    libmpi.so.1 -> libmpi.so.1.5.0
    libvt.so.0 -> libvt.so.0.0.0
    libmca_common_sm.so.4 -> libmca_common_sm.so.4.0.3
    libompitrace.so.0 -> libompitrace.so.0.0.0

看起来 Libs 包含在 ld 搜索路径中。

然而,我仍然遇到和以前一样的问题。

/usr/bin/ld: cannot find -lmpi_usempi
/usr/bin/ld: cannot find -lmpi_mpifh
/usr/bin/ld: cannot find -lmpi
collect2: error: ld returned 1 exit status
make: *** [mcp2_mpi] Error 1

针对这个问题有什么建议吗?非常感谢。

答案1

您尝试过的步骤会影响运行库搜索路径。假设您使用gcc,设置编译时间搜索路径需要使用编译器的-L标志

   -Ldir
       Add directory dir to the list of directories to be searched for -l.

例如,如果您已将库安装到 /usr/local/openmpi/lib 中,则请将gcc命令行修改为

-L /usr/local/openmpi/lib -lmpi_usempi -lmpi_mpifh -lmpi

答案2

已解决:编译 openmpi 代码时出现“找不到 -lmpi*”

解决方案:我尝试检查编译命令行中的其他选项。我在编译命令行中添加了一个额外的 -static。通过删除它,它终于对我有用了。

答案3

Ubuntu 20.04 的运行设置

一般来说,您必须将pkg-config标志传递给编译命令才能够进行编译,例如:

sudo apt install libopenmpi-dev
gcc $(pkg-config --cflags mpi) main.c $(pkg-config --libs mpi)

sudo apt install libmpich-dev
gcc $(pkg-config --cflags mpich) main.c $(pkg-config --libs mpich)

取决于您是否需要 openmpi 或 MPICH:https://stackoverflow.com/questions/2427399/mpich-vs-openmpi

理论上,这两者都可以编译出如下的简单测试:

#include <mpi.h>

int main() {
  MPI_Finalize();
  return 0;
}

然而,在 Ubuntu 20.04 上只有 MPICH 可以工作,因为该libopenmpi-dev软件包有一个错误并且忘记了符号链接:

/usr/lib/x86_64-linux-gnu/libmpi.so -> /usr/lib/x86_64-linux-gnu/libmpi.so.40

因此您可以手动执行此操作作为解决方法:

sudo ln -s /usr/lib/x86_64-linux-gnu/libmpi.so.40 \
           /usr/lib/x86_64-linux-gnu/libmpi.so

错误报告位于:https://bugs.launchpad.net/ubuntu/+source/openmpi/+bug/1869612

我通过以下方式找到了它libmpi.so

locate libmpi.so
dpkg -L libopenmpi-dev

但如果我将其直接传递给编译命令,它就可以工作:

gcc $(pkg-config --cflags mpi) main.c /usr/lib/x86_64-linux-gnu/libmpi.so.40

我现在也从包中了解到了/usr/bin/mpicc包的存在openmpi-binhttps://stackoverflow.com/questions/20739909/what-is-mpic-file-used-forlibopenmpi-dev由于缺少libmpi.so符号链接,该版本在 Ubuntu 上也似乎损坏了。

答案4

根据 OpenMPI 文档,建议不要静态构建 MPI。Wilf 的回答让我很困惑,因为我的一个库(如果有人好奇的话,是 CUDD)通常需要该-static标志才能构建。如果我只是简单地删除该标志,构建将失败。

通过研究骨髓间充质干细胞海湾合作委员会,我发现mpicxx -static和 的gcc -static想法不一样。幸运的是,CUDD 实际上可以构建为共享库。我配置并构建了共享库,然后可以毫无问题地删除 -static 标志。

相关内容