2013-04-30 130 views
0

我正在使用包含許多不同功能的Fortran庫。要發展它,更容易維護它,我已經分成這個庫分爲幾個模塊(例如,part1.f90part2.f90part3.f90),並使用所有這些單個模塊主模塊mylib.f90使用其他模塊編譯和鏈接模塊

module mylib 
    use part1 
    use part2 
    use part3 
    implicit none 
end module mylib 

的想法是再使用這個主要模塊在我的程序中用use mylib。然而,我無法編譯和鏈接這些模塊。

這些模塊都包含並編譯在一個目錄/mylib/src/,因此它也包含相應的*.o*.mod文件。當我編譯我的程序在不同的目錄中使用:

gfortran -I/mylib/src myprog.f90 -o myprog 

我期望編譯器在指定的目錄中找到所需的模塊。但不幸的是,我收到一條錯誤消息,說明有實際包含在子模塊中的函數存在未定義的引用。

我在這裏做錯了什麼?

謝謝你的幫助!

回答

2

我認爲您正在省略可找到模塊功能的可執行表示()的目標文件的鏈接。使用-I選項,您告訴編譯器在哪裏可以找到包含文件(.mod文件),但是您無法告訴它鏈接您已擁有的.o文件,我認爲這些文件已經創建。將它們連接一個簡單的方法是大意如下編輯編譯命令:

gfortran -I/mylib/src -o myprog myprog.f90 /mylib/src/part1.o /mylib/src/part2.o ... 

我想到,如果我用命令行編譯(我不知道,我用make或其他一些構建系統)我知道如何只指定一次到.o文件的路徑。有人可能遲早會來這裏,把我們都放在這張特定的照片中,或者你可以闖入文檔。

+0

謝謝您的回覆!然而,當我將程序與庫鏈接時,我試圖繞過提及所有對象的需要。 – remek 2013-05-01 14:54:31

0

我發現從其他網站的一些信息,例如參見: http://fortranwiki.org/fortran/show/Library+distribution

第一種方法將編譯的模塊,該*.mod文件保存在一個特定的目錄,例如/usr/lib/fortran,並使用ar -r libmylib.a *.o創建包含*.o文件的檔案libmylib.a。然後,爲了編譯我的程序,我將添加標記-I/usr/lib/fortran以指示編譯器位於哪個模塊,以便在我的代碼中遇到use mylib時可以找到它們。最後,我會使用標記-lmylib將我的程序與歸檔庫鏈接,並指示歸檔庫位於-L的位置。

這種方法的問題是Fortran編譯模塊是依賴於編譯器的,這意味着如果在一臺機器上使用不同的編譯器甚至不同版本的相同編譯器,我們必須小心。

第二種方法將包括庫中的模塊在build目錄中,並與程序一起編譯它們。

歡迎任何其他建議!