【问题标题】:How do I compile this legacy FORTRAN 77 code with *.h files?如何使用 *.h 文件编译此旧版 FORTRAN 77 代码?
【发布时间】:2011-05-03 16:37:31
【问题描述】:

我有一组构成 FORTRAN 代码的 .F 和 .H 文件。我在编译 .H 文件时遇到了麻烦。 .H 文件包含一堆公共块。 .H 文件之一的示例是:

*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...

当我在 google 上搜索答案时,据说 .h 文件是 c/c++ 文件,但它们看起来不像是用 c/c++ 编写的。 gfortran 似乎也认为它们是 C 文件。

当我尝试编译时:

gfortran-4.5 -fdefault-real-8 -fbacktrace -fno-align-commons 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 文件或什么?

【问题讨论】:

  • 那些是头文件,你不要编译它们

标签: fortran header-files fortran-common-block


【解决方案1】:

你不编译那些。如果你 grep 其他 fortran 文件,你会看到它们被包含在使用 include HEAD.h 或 '#include "head.h"' 之类的东西中(第二个是我的猜测;我猜你正在运行fortran 文件上的 C 预处理器)。在编译过程中,无论 include 语句在哪里,这些包含语句基本上都在该 .h 文件的副本中读取。所以它是一段被使用的代码,但从未独立编译过。

在 Fortran 中包含头文件不再是最佳实践,更是如此,因为它们被用于通过代码广泛分发公共块。所以不要使用这种方法编写任何新代码。但这就是这段特殊的旧代码正在做的事情。

【讨论】:

  • 您应该查看包含标题的文件以了解它们是如何被包含的。要让 gfortran 运行 C 预处理器,请使用编译选项 -cpp。
  • 您可能还需要编译器选项 -ffixed-line-length-72 以使 gfortran 忽略第 73 到 80 列中的非源代码。“HEAD 1”等
  • 谢谢,我没有完全意识到它们是如何工作的。我习惯于将全局变量放在模块中,但是这段代码是在 95 之前编写的。它们实际上在代码中使用了“include 'HEAD.h'”语句。我将在我的 makefile 中去掉 *.h 文件的编译语句。
猜你喜欢
  • 2015-09-20
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 2014-11-16
相关资源
最近更新 更多