在Windows上编译C ++ / LapackE代码很好,但相同的代码在Linux

时间:2016-12-14 01:19:20

标签: c++ linux windows lapack complextype

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

请帮忙。谢谢!

2 个答案:

答案 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