在MacOS上使用OpenMPI的C ++语法时使用未声明的标识符“MPI”

时间:2016-07-31 03:37:56

标签: c++ macos mpi

我的MacOS上安装了OpenMPI和gcc。 OpenMPI的C语法可以完美运行。但是,始终无法识别OpenMPI的c ++语法。例如,void MPI::Init(int &argc, char**&argv);行显示错误use of undeclared identifier 'MPI'

有人可以提供一些详细的程序来解决这个问题吗?

#include "mpi.h"
#include <stdio.h>
#include <iostream>

using namespace std;

int main(int argc, char** argv) {


void MPI::Init(int &argc, char**&argv);

// Get the number of processes
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
//int Comm::Get_size() const
// Get the rank of the process
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

// Get the name of the processor
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);

// Print off a hello world message
printf("Hello world from processor %s, rank %d out of %d processors\n",
       processor_name, world_rank, world_size);


// Finalize the MPI environment. No more MPI calls can be made after this
MPI_Finalize();

}

3 个答案:

答案 0 :(得分:2)

您的OpenMPI安装似乎是在没有C ++绑定的情况下构建的。虽然OpenMPI仍然包含C ++绑定,但它们实际上是removed from the standard years ago。您可能必须重建OpenMPI以启用C ++绑定,这取决于您首先安装它的方式。

由于它们不是标准的一部分,因此建议首先不要使用C ++绑定。 相反,最常见的建议是使用Boost.MPI

不幸的是,Boost.MPI似乎不再积极开发(最后一个bug在2年前关闭),并且有一些非常讨厌的未解决问题,  所以我不推荐Boost.MPI。有一些很酷的MPI类型特征方法,但我不知道广泛接受/积极开发的包装器。

答案 1 :(得分:2)

在Mac OS X中使用自制软件安装open-mpi时我遇到了同样的问题(我是来自Debian / Ubuntu Linux的Mac OS X新手)。幸运的是,我解决了它。正如Zulan所说,你的open-mpi安装是在没有C ++绑定的情况下构建的。但是,我认为最好的解决方案是直接从源代码重建它。我直接从其主页下载.tar文件,如果你仔细观察,你会发现默认禁用了C ++绑定(在untar文件夹中执行以下操作):

$ ./configure -help
  

- enable-mpi-cxx启用C ++ MPI绑定(默认值:禁用)

所以,基本上我重建了open-mpi,直接添加了这个标志,如下所示:

$ ./configure --enable-mpi-cxx

然后,只需确保您知道安装它的位置(如果使用--prefix =或默认值)将其正确链接到您的makefile。

有关此问题的详细信息,请参阅此处:https://github.com/open-mpi/ompi/issues/3173

答案 2 :(得分:2)

如果您使用自制程序安装OpenMPI,则需要先卸载它:

brew uninstall openmpi

然后重新安装它,启用C ++绑定:

brew install openmpi --with-cxx-bindings

有关选项的完整列表,请参阅brew info openmpi。请注意,由于您未使用OpenMPI的默认版本,因此brew需要从源代码构建它而不是使用预编译的瓶子,因此安装时间会比平时长。