包含文件和模块#
你的程序可以包含在各种源文件中,全部存储在同一目录中或组织在一些方便的目录树中。组织的细节取决于个人品味、你所属的开发人员组所做的安排,或者只是程序的历史。无论目录结构是什么,你都会遇到编译器需要帮助才能编译特定源文件的情况:
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 文件就在同一个目录生成)对于包含许多源文件的大型程序,考虑使用什么样的文件、代码结构非常重要。