2016-12-14 116 views
-1

用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

你還沒有解釋「問題」是什麼。在事物的宏偉計劃中,重新包裝包含文件是一件微不足道的事情,可以在幾秒鐘內發出。 「問題」似乎已經解決了:重新排序包含文件。 –

回答

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

1

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