Oracle® Developer Studio 12.5:Fortran 用户指南

退出打印视图

更新时间: 2016 年 6 月
 
 

2.2 调用编译器

在 shell 提示符下调用的编译器有一个简单的命令,其语法是:

f95 [options] files...

其中,files… 是一个或多个以 .f.F.f90.f95.F90.F95.for 结尾的 Fortran 源文件名称;options 是一个或多个编译器选项标志。(以 .f90.f95 扩展名结尾的文件是只能由 f95 编译器识别的“自由格式”Fortran 95 源文件。)

在下面的示例中,我们在启用运行时调试的情况下,使用 f95 来编译两个源文件以生成名为 growth 的可执行文件:

demo% f95 -g -o growth growth.f fft.f95

注 -  可以使用 f95f90 命令来调用 Fortran 编译器。

新增功能:该编译器还接受扩展名为 .f03.F03 的源文件。这些文件将被视为与 .f95.F95 等效,并且可以作为一种方式来表示源文件包含 Fortran 2003 扩展名。

命令行文件命名约定说明了编译器可以识别的各种源文件扩展名。

2.2.1 编译和链接序列

在上一示例中,编译器自动生成加载器对象文件 growth.offt.o,然后调用系统链接程序以创建可执行程序文件 growth

在编译后,对象文件 growth.offt.o 将保留。此约定使您可以方便地重新链接和重新编译文件。

如果编译失败,您将收到每个错误的对应消息。对于出现错误的源文件,不会生成任何 .o 文件,也不会写入任何可执行程序文件。

2.2.2 命令行文件命名约定

在命令行上出现的文件名后附加的后缀扩展名决定了编译器处理文件的方式。如果文件名的后缀扩展名不是下面列出的任意一个扩展名,或者没有扩展名,则这些文件名将传递给链接程序。

表 1  由 Fortran 编译器识别的文件名后缀
后缀
语言
操作
.f
Fortran 77 或 Fortran 95 固定格式
编译 Fortran 源文件,将对象文件放在当前目录中;对象文件的缺省名称是源文件的名称,但具有 .o 后缀。
.f95.f90
Fortran 95 自由格式
执行与 .f 相同的操作
.f03
Fortran 2003 自由格式
执行与 .f 相同的操作
.for
Fortran 77 或 Fortran 95 固定格式
执行与 .f 相同的操作。
.F
Fortran 77 或 Fortran 95 固定格式
在编译前,将 Fortran(或 C)预处理程序应用于 Fortran 77 源文件。
.F95.F90
Fortran 95 自由格式
在 Fortran 编译 Fortran 95 自由格式源文件前,将 Fortran(或 C)预处理程序应用于该文件。
.F03
Fortran 2003 自由格式
.F95 相同。
.s
汇编程序
使用汇编程序汇编源文件。
.S
汇编程序
在对汇编程序源文件进行汇编之前,将 C 预处理程序应用于该文件。
.il
内联扩展
处理内联扩展的模板文件。编译器将使用模板来扩展选定例程的内联调用。(模板文件是特殊的汇编程序文件;请参见 inline(1) 手册页。)
.o
对象文件
将对象文件传递到链接程序。
.a.so.so.n
将库名称传递给链接程序。.a 文件是静态库,.so.so.n 文件是动态库。

Fortran 95 自由格式在源语言功能中进行说明。

2.2.3 源文件

Fortran 编译器可从命令行接受多个源文件。单个源文件(也称为编译单元)可以包含任意数量的过程(主程序、子例程、函数、块数据、模块等)。可以将应用程序配置为每个文件一个源代码过程,或者将协同工作的过程集中到单个文件中。

2.2.4 源文件预处理程序

f95 支持两种源文件预处理程序:fppcpp。编译器可以在编译之前调用任一源文件预处理程序来扩展源代码“宏”和符号定义。缺省情况下,编译器将使用 fpp-xpp=cpp 选项可将缺省设置由 fpp 更改为 cpp。(另请参见有关 -Dname 选项的论述。)

fpp 是 Fortran 特定的源文件预处理程序。有关详细信息,请参见 fpp(1) 手册页。缺省情况下,系统会对具有 .F.F90F95,.F03 扩展名的文件调用该预处理程序。

fpp 的源代码可从 Netlib 获得。

有关标准 Unix C 语言预处理程序的信息,请参见 cpp(1)。对于 Fortran 源文件,建议使用 fpp 而不是 cpp

2.2.5 分别编译和链接

可以在不同的步骤中进行编译和链接。-c 选项编译源文件并生成 .o 对象文件,但不会创建可执行文件。如果不使用 -c 选项,则编译器将调用链接程序。如果通过这种方式将编译和链接步骤分开,那么就不必只为了修复一个文件而重新执行完整的编译,如以下示例所示:

使用单独的步骤来编译一个文件,并将其与其他文件链接在一起:

demo% f95 -c file1.f                          (Make new object file)
demo% f95 -o prgrm file1.o file2.o file3.o         (Make executable file)

请确保链接步骤列出了生成完整程序所需的全部对象文件。如果在此步骤中缺少任何对象文件,则链接将失败,并显示未定义的外部引用错误(缺少例程)。

2.2.6 一致编译和链接

每当分步完成编译和链接时,确保编译和链接选项的一致选择至关重要。在使用选项编译程序的任何部分时,必须使用相同的选项进行链接。另外,许多选项要求使用该选项编译所有源文件,包括链接步骤。

第 3 章中的选项描述指明了此类选项。

示例: 用 -fast 编译 sbr.f,编译 C 例程,然后分步进行链接:

demo% f95 -c -fast sbr.f
demo% cc -c -fast simm.c
demo% f95 -fast sbr.o simm.o        link step; passes  -fast  to the linker

2.2.7 无法识别的命令行参数

编译器无法识别的任何命令行参数都将解释为可能是链接程序选项、对象程序文件名或库名称。

基本区别是:

  • 无法识别的选项(带有 -)会生成警告。

  • 无法识别的非选项(不带 -)不生成警告。但是,这些非选项将被传递给链接程序,如果链接程序无法识别它们,它们将生成链接程序错误消息。

例如:

demo% f95 -bit move.f           <- -bit 不是可识别的 f95 选项
f95: Warning: Option -bit passed to ld, if ld is invoked, ignored otherwise
demo% f95 fast move.f           <-用户原本打算键入 -fast
ld: fatal: file fast: cannot open file; errno=2
ld: fatal: File processing errors.  No output written to a.out

请注意,在第一个示例中,f95 无法识别 -bit,该选项将被传递给链接程序 (ld),后者试图对其进行解释。因为单字母 ld 选项可以串联起来,所以链接程序会将 -bit 视为 -b -i -t,而这些都是合法的 ld 选项!这可能是(也可能不是)用户所希望的结果。

在第二个示例中,用户本想键入 f95 选项 -fast,但忽略了前导短划线。编译器再次将参数传递给链接程序,而链接程序将参数解释为一个文件名。

这些示例表明在编写编译器命令行时应格外小心!

2.2.8 模块

f95 自动为在源文件中遇到的每个 MODULE 声明创建模块信息文件,并搜索 USE 语句所引用的模块。对于遇到的每个模块 (MODULE module_name),编译器都在当前目录中生成相应的文件 module_name.mod。例如,f95 为文件 mysrc.f95 中出现的 MODULE list 单元生成模块信息文件 list.mod

有关如何设置写入和搜索模块信息文件时所用的缺省路径的信息,请参见 -Mpath-moddir dirlist 选项标志。

有关隐式调用所有编译单元中的 MODULE 声明的信息,另请参见 -use 编译器选项。

使用 fdumpmod(1) 命令可显示有关 .mod 模块信息文件内容的信息。

有关详细信息,请参见模块文件