包含文件和模块#

你的程序可以包含在各种源文件中,全部存储在同一目录中或组织在一些方便的目录树中。组织的细节取决于个人品味、你所属的开发人员组所做的安排,或者只是程序的历史。无论目录结构是什么,你都会遇到编译器需要帮助才能编译特定源文件的情况:

  • 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 文件被放在和对象(object)文件相同的目录。当程序代码在不同的子文件夹被组织起来,编译整个项目,它们将被分散在整个树状目录中。幸运的是,许多编译器允许你指定这些文件的生成目录。对于 gfortran 是 -J,示例 -J../inlcude(这样 .mod 文件就在同一个目录生成)

  • 对于包含许多源文件的大型程序,考虑使用什么样的文件、代码结构非常重要。