2015-02-09 30 views
0

我發現了一些關於此問題的先前問題,但無法找到正確關聯Makefile中的庫和模塊文件*.mod的建議。 我有一個項目目錄名爲project其中一個庫中的所有源文件都在project/src,所有編譯*.mod文件都放在project/include,並創建靜態庫到使用以下目錄project/lib正確構建Fortran庫並使用它們構建應用程序

ar rc myLibrary.a module1.o module2.o module3.o 

在此之後,我在目錄project/applications中創建應用程序代碼(使用這些庫的Fortran程序)。我現在在根級別(即project內部)創建了一個可以構建應用程序的簡單shell腳本。這部分是我無法讓流程工作的地方。

下面是我在做什麼:

INCLUDELIB='./include' 
LINKLIB='./lib' 
INCLUDEOTHER=<include directories for other math libraries> 
LINKOTHER=<link directories and link flags for other math libraries> 
COMPILER='ifort' 
COMPOPTS=<compiler flags, currently I use none> 
# building the application: 
$COMPILER $COMPOPTS -c ./applications/application.f90 -I$INCLUDELIB $INCLUDEOTHER -L$LINKLIB $LINKOTHER 
$COMPILER $COMPOPTS application.o -I$INCLUDELIB $INCLUDEOTHER -L$LINKLIB $LINKOTHER -o application.out 

此過程不起作用,它給Error in opening the compiled module file. Check INCLUDE paths.

我嘗試了上述的幾個變種從我讀這個在網絡上,並我希望這不是一些輕微/愚蠢的錯誤,我忽略了導致這一點的原因。

任何幫助或建議將不勝感激。

回答

1

這是您在圖書館做得不對的情況下得到的訊息(這不是您的錯!)。

*.mod文件編譯器特定的,但不*.o文件:gfortran的*.mod文件與ifort的*.mod文件兼容。因此,在構建庫時,應該將模塊的所有API函數和子例程置於之外。例如:

不這樣做:

module x 
... 
contains 

subroutine sub_x 
    ... 
end subroutine sub_x 

end module 

,但做到這一點,而不是:

module x 
... 
end module 

subroutine sub_x 
    use x 
    ... 
end subroutine sub_x 

這樣,你不要求用戶使用MOD文件,並可以將您的圖書館作爲.a.so存檔分發。

在你的情況下,你使用的庫幾乎可以肯定用gfortran編譯,所以你被gfortran困住了。解決方案是將另一個庫作爲原始庫的包裝器。例如,對於每個函數/子程序,你需要做到這一點 :

subroutine wrapped_sub_x(arguments) 
    use x 
    call sub_x(arguments) 
end 

然後,您編譯gfortran的包裝庫在.a存檔,您鏈接到與ifort項目。在你的項目中,不要忘記調用你的包裝庫而不是原始庫。

+0

非常感謝您的解釋。它有助於使事情更清晰。但是,在這種情況下,所有文件都是我自己編寫的庫。它們都使用相同的編譯器進行編譯。我實際上認爲我遇到了一個問題,即在編譯步驟中我做了錯誤的事情。有什麼你可以看到可能是我正在使用的編譯過程的問題? – computanjohn 2015-02-09 19:40:52

+0

1)你確定你使用的模塊已經被編譯了嗎? (相應的.mod文件存在)2)也許你在''use''之後犯了一個錯字。 3)如果一切似乎100%正確,那可能是因爲錯誤而在源文件中插入了不可打印的字符。嘗試刪除出現錯誤的整行並重新輸入。 – 2015-02-10 00:11:10