C 未知呼叫约定

c++ unknown calling convention

本文关键字:约定 呼叫 未知      更新时间:2023-10-16

我正在构建的一个软件包(sprng,链接在这里,但对此问题不必要(在我不熟悉的某些地方使用了呼叫语法。对于我以前的依赖关系堆栈(Intel 16.0带有OpenMPI 1.10.1(,它起作用了。不幸的是,我目前的堆栈(具有OpenMPI 3.1.3的Intel 19(不喜欢它。我不是c++人,除非我必须进行。

示例代码是:

#include <mpi.h>
int main(int argc, char *argv[]) {
  int myid;
  MPI::Init(argc, argv);
  myid = MPI::COMM_WORLD.Get_rank();
}

在上一个堆栈上,这似乎很好:

$ mpic++ --version
icpc (ICC) 16.0.0 20150815
Copyright (C) 1985-2015 Intel Corporation.  All rights reserved.
$ mpirun --version
mpirun (Open MPI) 1.10.1
Report bugs to http://www.open-mpi.org/community/help/
$ mpic++ sprng_issue.cpp
<no errors>

但是有新的堆栈:

$ mpic++ --version
icpc (ICC) 19.0.1.144 20181018
Copyright (C) 1985-2018 Intel Corporation.  All rights reserved.
$ mpirun --version
mpirun (Open MPI) 3.1.3
Report bugs to http://www.open-mpi.org/community/help/
$ mpic++ sprng_issue.cpp 
sprng_issue.cpp(6): error: name followed by "::" must be a class or namespace name
    MPI::Init(argc, argv);
    ^
sprng_issue.cpp(7): error: name followed by "::" must be a class or namespace name
    myid = MPI::COMM_WORLD.Get_rank();
           ^
compilation aborted for sprng_issue.cpp (code 2)

我的问题是:

  1. 此调用方法有名称吗?我很难搜索,因为只是。有多奇怪/旧/非标准?

  2. 是否有编译器标志(Intel或其他(可以实现遗产行为?

  3. 任何其他建议,用于不实质修改软件包代码的简便方法?

C++绑定是多年前从标准中删除的,默认情况下不再构建在开放MPI中。

从长远来看,您应该现代化代码(使用普通的C绑定或其他抽象层,例如Boost.MPI(。

同时,您可以简单地使用configure --enable-mpi-cxx重建MPI。