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
使用 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