C ++未知调用约定
c++ unknown calling convention
我正在构建的一个包(SPRNG,link 是 here 但对于这个问题是不必要的)在一些我不熟悉的地方使用了调用语法。对于我以前的依赖堆栈(Intel 16.0 和 OpenMPI 1.10.1),它有效。不幸的是,我当前的堆栈(带有 OpenMPI 3.1.3 的英特尔 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)
我的问题是:
这个调用方法有名称吗?我在搜索时遇到了麻烦,因为它只是。 strange/old/non-standard怎么样?
是否有编译器标志(Intel 或其他)来启用遗留行为?
有没有其他建议可以轻松通过而无需大量修改包代码?
C++
绑定在很多年前就已从标准中删除,并且在 Open MPI 中默认情况下不再构建它们。
在长 运行 上,您应该使代码现代化(使用普通 C
绑定或其他抽象层,例如 Boost.MPI
)。
同时,您可以使用 configure --enable-mpi-cxx
简单地重建 Open MPI。
我正在构建的一个包(SPRNG,link 是 here 但对于这个问题是不必要的)在一些我不熟悉的地方使用了调用语法。对于我以前的依赖堆栈(Intel 16.0 和 OpenMPI 1.10.1),它有效。不幸的是,我当前的堆栈(带有 OpenMPI 3.1.3 的英特尔 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)
我的问题是:
这个调用方法有名称吗?我在搜索时遇到了麻烦,因为它只是。 strange/old/non-standard怎么样?
是否有编译器标志(Intel 或其他)来启用遗留行为?
有没有其他建议可以轻松通过而无需大量修改包代码?
C++
绑定在很多年前就已从标准中删除,并且在 Open MPI 中默认情况下不再构建它们。
在长 运行 上,您应该使代码现代化(使用普通 C
绑定或其他抽象层,例如 Boost.MPI
)。
同时,您可以使用 configure --enable-mpi-cxx
简单地重建 Open MPI。