致命错误: mpi.h文件不存在 #include <mpi.h>

61

当我只使用这个命令编译我的脚本时

#include <mpi.h>

它告诉我找不到该文件或目录,但当我把路径包含进mpi.h时

#include "/usr/include/mpi/mpi.h"

路径正确时返回:

In file included from /usr/include/mpi/mpi.h:2087:0,
                 from lbm.cc:7:
/usr/include/mpi/openmpi/ompi/mpi/cxx/mpicxx.h:35:17: fatal error: mpi.h: No such file or directory
 #include "mpi.h"
                 ^
compilation terminated.

有人知道如何修复这个问题吗?


你使用的编译器和操作系统是什么? - muradin
g++在Linux上无法工作,而<mpi/mpi.h>也不起作用。 - user2804865
1
使用消息传递接口编写的程序应该使用类似于mpicc main.c -o main或者 mpiCC main.cpp -o main这样的命令进行编译。关于第二条信息:你的计算机上可能有两个MPI标准的实现。您可以通过键入which mpiccwhich mpirunmpirun --versionmodule avail来了解更多信息。编译器命令的实现(openmpi还是mpich2等)必须与执行程序的命令相同,即mpirun -np 2 main - francis
11个回答

53
几乎肯定的问题是您没有使用MPI编译器包装程序。每次编译MPI程序时,应该使用MPI包装程序:
  • C - mpicc
  • C++ - mpiCCmpicxxmpic++
  • FORTRAN - mpifortmpif77mpif90
这些包装程序为您完成所有繁琐的工作,确保在编译程序时包括所有适当的编译器标志、库、包含目录、库目录等。

1
难题在于openmpi没有mpicc、mpicxx等MPI包装器。 - Marc J. Driftmeyer
1
可能有一些实现不提供它们,但Open MPI不是其中之一。它肯定至少有mpiccmpicxxmpifortan - Wesley Bland
7
你能解释如何修复这个问题吗?我正试图编译某人的程序,但是出现了原始帖子中提到的错误。它正在寻找mpi.h文件。我使用apt-get安装了API,但仍然得到相同的错误提示。 - user391339
3
没有提供如何使用这些包装器的信息;是将它们添加到编译器中,例如使用“-mpiCC”参数,还是安装一个包装器并在源文件中包含它? - Terry
1
@user391339 和 Romario,你们的 IDE 默认使用 cmake 或其他工具来编译 .cpp 文件,对吧?相反,你们可以使用 mpi 包装器(它只是一个编译/执行命令)来编译/执行程序。例如:$ mpic++ main.cpp,运行程序的示例为 $ mpirun -np 2 a.out。 - Hasnaa Ibraheem

52

在我的系统上,我只是缺少Linux软件包。

sudo apt install libopenmpi-dev
pip install mpi4py

(使用它的示例,是一个很好的即时测试,以查看其是否成功)

成功。


如果您在构建LAMMPS时遇到此错误,此解决方案的第一行也适用: $ cmake ../cmake
  • 运行检查基于make的构建系统生成的自动生成文件 CMake Error in /home/name/lammps-23Jun2022/build/CMakeFiles/CMakeScratch/TryCompile-Iqf2dm/CMakeLists.txt: 导入的目标"MPI::MPI_CXX"包含不存在的路径 "/usr/lib/x86_64-linux-gnu/openmpi/include"在其INTERFACE_INCLUDE_DIRECTORIES中。
- user30850

14

你可以执行:

$ mpicc -showme 

结果:

gcc -I/Users/<USER_NAME>/openmpi-2.0.1/include -L/Users/<USER_NAME>/openmpi-2.0.1/lib -lmp

这个命令会显示编译mpicc所需的必要库

例子:

$ mpicc -g  -I/Users/<USER_NAME>/openmpi-2.0.1/include -o [nameExec] [objetcs.o...] [program.c] -lm


$ mpicc -g  -I/Users/<USER_NAME>/openmpi-2.0.1/include -o example file_object.o my_program.c otherlib.o -lm

这个命令将生成一个包含你的程序的可执行文件。例如,你可以执行:

$ ./example

1
你是在建议使用包装器来提取一些信息,然后再将其传递回包装器吗? - Gilles Gouaillardet

7
在我的Ubuntu 16.04系统上,我安装了以下内容:
sudo apt install libopenmpi-dev

我使用mpiCC进行了编译,它能正常工作。


5
如上所建议,包括

的内容

/usr/lib/openmpi/include 

在包含路径中处理这个问题(在我的情况下)


对于OpenSUSE Leap,/usr/lib64/mpi/gcc/openmpi/include/。 - Max

3
Debian似乎包含以下内容:
  • mpiCC.openmpi
  • mpic++.openmpi
  • mpicc.openmpi
  • mpicxx.openmpi
  • mpif77.openmpi
  • mpif90.openmpi
我将测试每个的符号链接,以便像HDF5-openmpi启用的程序能够找到mpi.h。
纠正一下,Debian通过其替代系统包含符号链接,但仍无法在H5public.h头文件中引用的HDF5 openmpi软件包和mpi.h之间找到正确的路径。

2
在Ubuntu 18.04上,我需要安装以下内容:
sudo apt install lam4-dev

使用Open-MPI 3+或MPICH 3+,不要使用古老的Lam。 - Jeff Hammond

1
在 Fedora 上:
dnf install openmpi-devel

1

一旦您安装了MPI:

$ sudo apt install mpich

查看库的安装位置,每种情况都不同:

$ mpicc -show

在我的情况下:(Ubuntu 20.0)

然后添加...

#include </usr/lib/x86_64-linux-gnu/openmpi/include/openmpi>

:-)


1
在Ubuntu 20.04上,这对我有效:
apt -y install lam-runtime

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接