2011-05-03 106 views
3

我有一個收集FORFAN代碼的.F和.H文件。我遇到了編譯.H文件的麻煩。 .H文件包含一堆通用塊。在.h文件之一的一個例子是:如何使用* .h文件編譯此舊版FORTRAN 77代碼?

*AC HEAD  
c                  HEAD 1 
     common/blah/ x(25), y, z(25), p(25,mnv),       HEAD 2 
    1    t(25,mx), d(25,mnv)        HEAD 3 
c                  HEAD 4 
ETC... 

當我搜索在谷歌的回答,它是說,.h文件是C/C++文件,但他們並不像他們寫在c/C++中。 gfortran似乎也認爲他們是C文件。

當我嘗試編譯:

gfortran-4.5 -fdefault實時的8 -fbacktrace -fno-ALIGN-公共HEAD.h

我得到的錯誤:

cc1: warning: command line option "-fdefault-real-8" is valid for Fortran but not for C 
cc1: warning: command line option "-fbacktrace" is valid for Fortran but not for C 
cc1: warning: command line option "-fno-align-commons" is valid for Fortran but not for C 
HEAD.h:1:5: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘HEAD’ 

我嘗試將第一行'* AC HEAD'註釋掉,但是這個錯誤是關於在*之前尋找屬性的。我是否需要在HEAD#值的最後一列中列出一些內容,是否需要使用C++編譯器構建.H文件?

+1

這些是頭文件,你不編譯它們 – Anycorn 2011-05-03 16:42:10

回答

7

你不編譯這些。如果你grep其他Fortran文件,你會發現它們包含在使用include HEAD.h或'#include「head.h」'(第二個是我的猜測;我猜你正在運行C預處理器在fortran文件上)。這些包括聲明基本上在編譯過程中包含聲明的任何地方讀取該.h文件的副本。所以這是一段使用過的代碼,但從來沒有編譯過。

在Fortran中包含的頭文件是而不是不再是最佳實踐,更重要的是因爲它們用於通過代碼廣泛分發公共塊。所以不要使用這種方法編寫任何新代碼。但這就是這個特定的舊代碼正在做的事情。

+1

你應該看看包括頭文件在內的文件,看看它們是如何被包含的。要讓gfortran運行C預處理器,請使用編譯選項-cpp。 – 2011-05-03 16:50:09

+1

您可能還需要編譯器選項-ffixed-line-length-72才能讓gfortran忽略列73到80中的非源代碼。「HEAD 1」等。 – 2011-05-03 17:17:31

+0

謝謝,我沒有完全意識到它們是如何工作。我習慣於將全局變量放在模塊中,但是這些代碼是在95之前編寫的。它們實際上在代碼中使用了「include'HEAD.h'」語句。我將刪除makefile中* .h文件的編譯語句。 – Bob 2011-05-03 17:18:10