在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。
请帮忙。谢谢!
首先,将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"
。
@ 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
在这个网站上,https://gcc.gnu.org/ml/libstdc++/2007-02/msg00168.html,据说“目前C++不会分析C99复杂类型的语法,我知道知道建议这样做...”。但编译工作在Windows上。 – Boki
@ Ben Voigt:添加到我上面的评论,额外的错误都与LapackE头文件有关。 – Boki
显而易见的答案是,'/ home'中包含的头文件之一使用''和'“minMathsForEPM.h” ,但没有明确地“包含”他们自己。因此,你需要自己做。 –
@ Sam Varshavchik:棘手的事情是在最后一段,如果在“工作代码”(第二个代码)中添加程序,那么它不起作用,所有的错误都与复杂数量的声明有关。这在Windows上编译时不会发生。 – Boki
你还没有解释“问题”是什么。在事物的宏伟计划中,重新包装包含文件是一件微不足道的事情,可以在几秒钟内发出。 “问题”似乎已经解决了:重新排序包含文件。 –