2

好的,我有一個Linux HPC上的大型開源程序的源代碼。有兩個不同的系統組成HPC,arc1和arc2,它們共享一個文件系統。從本質上講,我需要兩個單獨編譯的程序版本,因爲這兩個系統有不同的庫和編譯器版本等。但是,我希望能夠從相同的源代碼編譯這兩個版本。用gfortran編譯的程序,如何用ifort重新編譯?

我遇到的問題是,一旦我用特定的編譯器編譯了一次代碼,它似乎就會被鎖定到特定的編譯器。當我嘗試隨後與不同的編譯器重新編譯,甚至在同一個系統,它給我的表格的許多錯誤:

[file.o]:[line]: undefined reference to '_gfortran_****' 

其中****是一些不同的內置的Fortran功能。我不得不承認我對編譯器的工作原理知之甚少,所以我無法解釋這一點。

所以,我的查詢可以歸結爲兩個主要問題:

1)是否有任何快速修復gfortran版本之間的「未定義的引用」錯誤?該代碼最初是在arc1上用gfortran 4.1.2編譯的,我試圖在arc2上用gfortran 4.4.7編譯它。 2)如果沒有,有沒有辦法「解鎖」代碼,以便我可以在兩個系統上用ifort重新編譯它(因爲兩個系統都安裝了相同版本的ifort)?在我嘗試在任一系統上使用ifort編譯它時,它拋出了數以千計的「未定義的引用」錯誤。

+0

你確定你是否用gfortran編譯了代碼中使用的每個庫? –

+0

我不這麼認爲,該程序主要是在Fortran中,但我認爲一些圖形位和bob是用C++編寫的。安裝腳本受限於使用Fortran和C++編譯器的同義版本。 – user3393587

+0

顯然有一些目標文件是由gfortran編譯的。鏈接器通常會打印文件的名稱。我相信它是'file.o'。 –

回答

2

評論總數。鏈接器清楚地接收由gfortran編譯的名爲file.o的目標文件,並且不知道從哪裏找到來自gfortran運行時庫的符號。構建腳本不用新編譯器重新編譯這個文件。

解決方案是使用特定構建系統的設施,例如, make clean,刪除以前版本生成的所有文件。

我注意到一些構建腳本可能會忽略的.mod文件也可能存在問題。