C++/LapackE 代码在 Windows 上编译正常,但相同的代码在 Linux 上编译失败

C++/LapackE code compiling fine on Windows, but the identical code fails compilation on Linux

使用 LapackE 和 MPI 库用 C++ 编写的代码在我使用 GNU C++ 4.9.2 的 Windows 上编译和运行良好。

将该代码迁移到 Linux (CentOS) 服务器 编译失败 ! Linux 机器上的 GNU C++ 是 4.4.7。我在这两种情况下都使用了相同的 LapackE 头文件。 MPI 在 Linux 机器上运行良好。

检查两台机器上的预处理器输出文件后,我可以将错误消息与以下情况相关联,其中 complex 原始代码中的声明已替换为 _Complex 。这是一个复杂动态数组 HAMILTONIAN 的声明示例,在 Linux:

上编译时出现问题

原始来源: lapack_complex_double* 哈密尔顿;

在 WINDOWS 预处理中。文件(运行良好): _lapack_complex_double* 哈密尔顿;

在 LINUX 预处理中。文件(编译失败): 双 _Complex* HAMILTONIAN;

这可能是与 GCC 的不同 版本 有关的问题吗?

我已经尝试了 #define _Complex complex,但最终还是没有用。

一些报告的 C99 _Complex 和 C++ complex 的互操作性问题:possible similar problem

请帮忙。谢谢!

it compiles OK even if I remove "extern "C" and just keep the #include "Headers_LAPACKE/..." in block#1 of the code.

这样做。 LAPACK headers 内部有 #if __cplusplus 检查,它们的设计使得用户代码不需要,也不应该 extern "C" 包围它们。

首先,将 GCC 编译器设置为 4.8 或更高版本:在我的例子中,我们必须保留旧的 GCC 4.4.7 并同时安装 GCC 4.9.2。为了能够在 MPI 编译中使用较新的版本,必须将其添加到 PATH 的前面。为此,请参阅 How to change default GCC compiler to be used with MPI on Linux CentOS

处的答案

其次,当使用 LapackE(Lapack 的 C 包装器)进行编译时,必须使用以下预处理器选项 (-D):

-D LAPACK_COMPLEX_STRUCTURE -D HAVE_LAPACK_CONFIG_H -D ADD_

示例:

bash-4.1$ mpiCC main.cpp -L/home/USER1/lapack-3.6.1 -llapacke -llapack -lblas -lm -Wall -D LAPACK_COMPLEX_STRUCTURE -D HAVE_LAPACK_CONFIG_H -D 添加_

确保:

bash-4.1$ gcc --version

给出 4.8 或更高。在我的例子中是:gcc (GCC) 4.9.3