使用LapackE和MPI库用C ++编写的代码在使用GNU C ++ 4.9.2的Windows上进行编译和运行。
将该代码迁移到Linux(CentOS)服务器无法编译! Linux机器上的GNU C ++是4.4.7。在这两种情况下我都使用了相同的LapackE头文件。 MPI在Linux机器上运行良好。
在检查两台机器上的预处理器输出文件时,我可以将错误消息与以下情况相关联,其中原始代码中的复杂声明被 _Complex 替换。下面是在Linux上编译时出现问题的复杂动态数组HAMILTONIAN的声明示例:
在原始资源中: lapack_complex_double * HAMILTONIAN;
在WINDOWS PREPROC中。文件(效果很好): _lapack_complex_double * HAMILTONIAN;
在LINUX PREPROC中。 FILE(编译失败): double _Complex * HAMILTONIAN;
这可能是与GCC的不同版本相关的问题吗?
我已经尝试了 #define _Complex complex ,但最终没有帮助。
有些人报告了C99 _Complex和C ++复杂性的互操作性问题:possible similar problem。
请帮忙。谢谢!
答案 0 :(得分:1)
即使我删除
"extern "C"
并在代码的第1个块中保留#include“Headers_LAPACKE / ...”,它也会编译好。
这样做。 LAPACK标头中包含#if __cplusplus
个检查,它们的设计使得用户代码不需要,也不应该extern "C"
围绕它们。
答案 1 :(得分:1)
首先,将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 ADD _
确保:
bash-4.1 $ gcc --version
给出4.8或更高。就我而言,它是:gcc(GCC)4.9.3