我曾尝试在 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-bin
https://stackoverflow.com/questions/20739909/what-is-mpic-file-used-for但libopenmpi-dev
由于缺少libmpi.so
符号链接,该版本在 Ubuntu 上也似乎损坏了。
答案4
根据
OpenMPI 文档,建议不要静态构建 MPI。Wilf 的回答让我很困惑,因为我的一个库(如果有人好奇的话,是 CUDD)通常需要该-static
标志才能构建。如果我只是简单地删除该标志,构建将失败。
通过研究骨髓间充质干细胞和海湾合作委员会,我发现mpicxx -static
和 的gcc -static
想法不一样。幸运的是,CUDD 实际上可以构建为共享库。我配置并构建了共享库,然后可以毫无问题地删除 -static 标志。