0

我在 AIX 上安装了gccgfortran,它们工作正常。除其他外,我将它们与一些由头文件(.h在 C 中)访问的库一起使用。相同的库可以与模块一起使用(.mod在 fortran 中),但正如您所知,它们的使用是可选的:如果我注释掉

use mylib
implicit none

从我的 fortran 源代码中,一切正常。问题是,我不想注释掉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 重新编译所有库,但很可能由于各种原因它会失败(如果没有,它仍然是一项艰巨的任务)。

所以我想知道是否有一种方法可以预编译模块.h中的标头.mod,只提供所需的接口信息。不幸的是,我无法找到有关此的任何信息。

4

2 回答 2

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。

于 2010-11-12T22:26:46.650 回答
1

您可以external在自定义文件中声明您在模块中使用的函数/子例程mylib.fh,例如:

#mylib.fh
external my_function

在您的 fortran 代码中,您将使用:

implicit none
include 'mylib.fh'
于 2010-11-15T13:07:48.180 回答