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

问题描述:

用C++编写的代码用LapackE和MPI库编译并运行在使用GNU C++ 4.9.2的Windows上很好。在Windows上编译C++/LapackE代码很好,但是相同的代码在Linux上编译失败

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

当在两台机器上的预处理器的输出文件检查,我可以涉及错误消息到在原始代码中复杂声明由_Complex替换以下几种情况。这里是在Linux编译时具有问题的复数动态阵列哈密顿的声明的例子:

IN THE ORIGNIAL SOURCE: lapack_complex_double *哈密顿;

IN WINDOWS PREPROC。 FILE(效果很好): _lapack_complex_double * HAMILTONIAN;

在LINUX PREPROC。 FILE(无法编译): double _Complex * HAMILTONIAN;

请问这是否与GCC的不同版本有关?

我试过了#define _Complex complex但最终没有帮助。

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

请帮忙。谢谢!

+0

显而易见的答案是,'/ home'中包含的头文件之一使用''和'“minMathsForEPM.h” ,但没有明确地“包含”他们自己。因此,你需要自己做。 –

+0

@ Sam Varshavchik:棘手的事情是在最后一段,如果在“工作代码”(第二个代码)中添加程序,那么它不起作用,所有的错误都与复杂数量的声明有关。这在Windows上编译时不会发生。 – Boki

+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 /家庭/ 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

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

这样做。 LAPACK头文件中有#if __cplusplus检查,它们被设计成使用户代码不需要,也不应该有围绕它们的extern "C"

+0

@ Ben Voigt:感谢Ben的反馈。如果我删除** extern“C”**,我会得到更多错误。其他类型为以下类型: 1)**错误:使用'C++'链接**'先前声明了'float __complex__ lapack_make_complex_float(float,float)'。 2) **错误:与具有'C'链接的新声明发生冲突** 这与LapackE标题中的以下行有关:lapack_complex_float lapack_make_complex_float(float re,float im); – Boki

+0

在这个网站上,https://gcc.gnu.org/ml/libstdc++/2007-02/msg00168.html,据说“目前C++不会分析C99复杂类型的语法,我知道知道建议这样做...”。但编译工作在Windows上。 – Boki

+0

@ Ben Voigt:添加到我上面的评论,额外的错误都与LapackE头文件有关。 – Boki