包含文件和模块#

您的程序可以包含在各种源文件中,所有这些文件都存储在同一个目录中,或者组织在一些方便的目录树中。组织的细节取决于个人喜好、您所属的开发人员组做出的安排,或者仅仅是程序的历史。无论目录结构如何,您都会遇到编译器需要帮助才能编译特定源文件的情况。

  • Fortran(和其他语言)有包含外部文件的功能。虽然随着模块的出现,此功能变得不太有用,但它仍然有其用途。通常,此类“包含文件”存储在与包含源文件的目录分开的目录中,因为它们在多个位置使用。通常,该目录的名称为“include”。

  • 正如我们所见,编译定义了一个或多个模块的源代码,会导致编译器生成所谓的“模块中间文件”(扩展名为“.mod”)。编译器需要访问这些文件才能读取接口和变量等等,并根据这些信息实际编译使用各种模块的源代码。

编译器支持 -I 之类的选项来指示这些包含文件和模块中间文件在哪里可以找到。假设我们将 tabulate 程序的两个文件存储在以下目录结构中

tabulate/
    main/
        tabulate.f90
    sub/
        functions.f90

使用以下命令编译文件“functions.f90”

$ cd sub
$ gfortran -c functions.f90

导致以下结构

tabulate/
    main/
        tabulate.f90
    sub/
        functions.f90
        user_functions.mod
        functions.o

为了成功编译并随后构建程序,我们需要告诉编译器在哪里可以找到文件“user_functions.mod”

$ cd main
$ gfortran -c tabulate.f90 -I ../sub
$ gfortran -o tabulate tabulate.o ../sub/functions.o

结果

tabulate/
    main/
        tabulate.f90
        tabulate.o
        tabulate (or tabulate.exe on Windows)
    sub/
        functions.f90
        functions.o
        user_functions.mod

注释

  • 每个编译器的细节都不同。有时 -I 选项后面应跟一个空格,然后是目录的名称,有时目录应连续出现。

  • 默认情况下,模块中间文件 (.mod) 会放在与目标文件相同的目录中。当您的程序代码组织在不同的子目录中时,它们将散布在整个目录树中,从而使编译过程复杂化。幸运的是,许多编译器允许您指定这些文件的输出位置。例如,对于 gfortran,它是 -J,例如:-J../include(以便所有 .mod 文件都出现在同一个目录中)

  • 对于由许多源文件组成的大型程序,仔细考虑要使用的组织方式非常重要。