包含文件和模块#
您的程序可以包含在各种源文件中,所有这些文件都存储在同一个目录中,或者组织在一些方便的目录树中。组织的细节取决于个人喜好、您所属的开发人员组做出的安排,或者仅仅是程序的历史。无论目录结构如何,您都会遇到编译器需要帮助才能编译特定源文件的情况。
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 文件都出现在同一个目录中)对于由许多源文件组成的大型程序,仔细考虑要使用的组织方式非常重要。