2010-11-12 80 views
0

我在AIX上安裝了gccgfortran,它們工作正常。除此之外,我將它們用於一些可通過頭文件訪問的庫(C中的.h)。非常相同的庫功能的模塊(.mod在FORTRAN)使用,但你知道它們的使用是可選的:如果我從我的Fortran源代碼中註釋掉從c頭創建mod文件

use mylib 
implicit none 

,一切工作正常。問題是,我不想註釋掉implicit none,所以我必須保持use mylib太多,否則我會得到一堆

Error: Symbol 'foo' at (1) has no IMPLICIT type 

錯誤。而且,正如你知道的,.mod文件是編譯器相關的,所以我不能用那些我有,否則gfortran會吐:

Fatal Error: File 'mylib.mod' opened at (1) is not a GFORTRAN module file 

理論上我可以重新編譯所有與gfortran庫,但最有可能它會由於各種原因失敗(如果不是這樣,它仍然是一項艱鉅的任務)。

所以我想知道是否有一種方法來預編譯.mod模塊中的.h標題,只提供所需的接口信息。不幸的是,我無法找到關於此的任何信息。

+0

你知道這些庫是用C還是fortran編寫的嗎?您可以通過檢查C頭文件來解決這個問題。我的猜測是這些庫將用C語言編寫,因爲fortran庫往往不兼容不同的供應商,並且你暗示你的代碼鏈接沒有問題。 – DaveP 2010-11-15 07:31:07

回答

2

C頭文件不會生成Fortran模塊文件。 Fortran模塊文件依賴於編譯器,但通常在編譯包含模塊的Fortran文件時生成。它們記錄有關源代碼模塊的信息,例如它包含的過程及其調用約定,供編譯器在遇到這些過程的調用時使用。這是編譯器自動顯式調用模塊例程的方法。通常,在編譯具有使用它的主程序或過程的文件之前,您必須編譯包含模塊的Fortran源代碼文件(此處爲模塊「mylib」)。你爲什麼認爲用gfortran編譯這些庫很可能會失敗,或者會令人望而生畏?我建議試試看。您無法將C .h文件編譯到模塊中。如果Fortran庫的作者希望他們能夠提供一個帶有Fortran接口的文件,這些接口描述了這些過程並且可以將其編譯爲模塊。但是這種技術容易出錯,因爲這意味着有兩件事必須保持一致。

如果這些庫位於C中,並且正在通過ISO C綁定從Fortran中調用,那麼最好的方法是編寫帶有接口的文件。提供了這樣一個Fortran文件嗎?是不是來自不正確的模塊文件?當你用gfortran編譯這個文件時,你會得到.mod文件。雖然實際的C源代碼和Fortran接口聲明之間的重複意味着必須維護兩個項目,在這種情況下,由於原始源代碼採用C語言並且Fortran接口語句將Fortran編譯器的C例程描述爲Fortran語言。

+0

問題中的庫非常大,而XL(非GNU)特定。如果您曾嘗試編譯任何針對IBM的XL Compute與GNU(或反之)的設計,您會知道爲什麼我認爲這是令人生畏或不可能的。我甚至不確定我可以訪問相關的源代碼.... – Davide 2010-11-14 04:05:37

1

你可以宣佈你從模塊在一個特製的文件mylib.fh使用作爲external的功能/子程序,例如:

#mylib.fh 
external my_function 

在你Fortran代碼,那麼您需要使用:

implicit none 
include 'mylib.fh' 
+0

是的,這是一個很好的建議。但是我可以在「如何從現有的mylib.h中自動創建這樣的mylib.fh - 而不用編寫我自己的解析器(我可以編寫)?」這個問題來重新解釋這個問題。 – Davide 2010-11-15 15:33:18

+0

嗯,我不知道這樣的方式。如果在fortran中將C函數作爲子例程調用,那麼根本不需要任何頭文件,所以我假設您將fortran中的函數作爲函數調用?你可以舉一個例子:(i)C頭文件中的函數聲明,(ii)你的fortran程序中的相應調用。如果C庫不打算被Fortran調用,那麼你可能不得不重寫接口,例如使用Fortran 77,這並不總是奏效。 – steabert 2010-11-15 16:34:23