2012-09-26 138 views
-1

我是Fortran的新手,所以也許這是一個直截了當的問題,但我還沒有找到任何通過查看SO上的類似帖子來工作的解決方案。Fortran模塊鏈接失敗

我的問題是,當我試圖編譯我的主要程序,通過執行

  1. gfortran -c dfft.f
  2. gfortran -c srft.f95
  3. gfortran -c testsrft.f95
  4. 使用在srft.f95定義的模塊srftModule testsrft.f95 gfortran dfft.o srft.o testsrft.o -o testsrft

(子程序S IN srftModule需要dfft.f中的Fortran77代碼),我得到的鏈接錯誤

testsrftF.o: In function `MAIN__': 
testsrftF.f95:(.text+0x98): undefined reference to `fftofmat_' 
collect2: ld returned 1 exit status 

該模塊的定義如下

module srftModule 
    implicit none 
    contains 
    ... (some subroutines) 

    subroutine fftofmat(A) 
    implicit none 
    real*8, dimension(:, :), intent(inout) :: A 
    ... 
    end subroutine fftofmat 

    ... (some more subroutines) 

end module srftModule 

而在我的主文件,我有

program testsrft 
    use srftModule 
    implicit none 

    ...(code to initialize a 10x10 matrix A) 
    call fftofmat(A) 

end program testsrft 

爲什麼連接器抱怨?

+0

鏈接器找不到'.mod'文件,請參閱http:// stackoverflow。com/questions/8855896/specify-directory-where-gfortran-should-look-for-modules –

回答

2

一些背景資料:

  • MAIN__是gfortran主程序用途的符號。
  • 通常,編譯器會對模塊過程的符號名稱進行調整,以包含主機模塊的名稱。在gfortran的情況下,符號看起來像__ modulename _MOD_ procedurename

未定義的引用錯誤中引用的符號與模塊過程引用的符號的引用模式不匹配。總之,這意味着在主程序中編譯器不會認爲fftofmat是一個模塊過程 - 這是您需要解決的問題。這是違背的,你告訴代碼,這樣的事情我會找...

  • 是你真正展示你正在使用的代碼(代碼對比,你認爲你鍵入/想代碼是相關的) - 使用語句是否存在,模塊過程名拼寫是否正確,模塊中沒有私有語句,主程序中的引用不在主機關聯名稱被隱藏的內部過程中,等等?
  • 源文件是否全部編譯沒有錯誤?是否有從先前成功編譯的「遺留」mod文件,可以從當前編譯的mod文件中優先選擇?

雖然我不認爲這是問題的原因,但請注意,有些系統對鏈接步驟中的對象文件和庫的排序非常敏感 - 更多的是在文件中搜索符號它遵循引用命令行上特定符號的文件。要保持健壯,您應該以相反的順序排列目標文件。

+0

我顯然沒有在主程序中使用srftModule行......我可以發誓我做了!謝謝。 – AatG