Compiling Fortran:修订间差异
Dbzhang800(留言 | 贡献) 小 →写在前面 |
Dbzhang800(留言 | 贡献) 小 →写在前面 |
||
第1行: | 第1行: | ||
{{TOCright}} | {{TOCright}} | ||
== 写在前面 == | == 写在前面 == | ||
* | *关于g77:对 Fortran 77 提供完备的支持,并支持 Fortran 90 和 95 的部分特性。由于 Fortran 77 在数值计算中的影响力,g77 可能是应用最广的Fortran编译器,但为了支持新标准,从 GCC 4.0 开始,GCC 不再绑定 Fortran 编译器 g77。 | ||
*关于gfortran:GNU最新的 Fortran | *关于gfortran:GNU最新的 Fortran 编译器,取代 g77 集成在 GCC 4.0 及以后版本中,目的是支持Fortran95和一部分Fortran2003的功能。 | ||
*关于g95:由于历史原因,g95 是一个基于 GCC 的 Fortran 编译器,但它不是 GCC 的一部分;g95 是另一个由他人维护的 fortran 编译器。 | *关于g95:由于历史原因,g95 是一个基于 GCC 的 Fortran 编译器,但它不是 GCC 的一部分;g95 是另一个由他人维护的 fortran 编译器。 |
2008年3月23日 (日) 20:42的版本
写在前面
- 关于g77:对 Fortran 77 提供完备的支持,并支持 Fortran 90 和 95 的部分特性。由于 Fortran 77 在数值计算中的影响力,g77 可能是应用最广的Fortran编译器,但为了支持新标准,从 GCC 4.0 开始,GCC 不再绑定 Fortran 编译器 g77。
- 关于gfortran:GNU最新的 Fortran 编译器,取代 g77 集成在 GCC 4.0 及以后版本中,目的是支持Fortran95和一部分Fortran2003的功能。
- 关于g95:由于历史原因,g95 是一个基于 GCC 的 Fortran 编译器,但它不是 GCC 的一部分;g95 是另一个由他人维护的 fortran 编译器。
Fortran 编程中相关文件后缀
.a | 静态库 (archive) |
.f, .for, .FOR .ftn*, .f90*, .f95*, .f03* | Fortran源代码(不需编译预处理) |
.F, .fpp, .FPP .FTN*, .F90*, .F95*, .F03* | Fortran源代码(需要编译预处理) |
.r | Fortran源代码(需要RatFor编译预处理) |
.o | 对象文件 |
.s | 汇编语言代码 |
.so | 动态库 |
其中,标 * 的后缀名是gfortran的文件后缀,g77不能识别。
单个源文件生成可执行程序
传统的 Fortran 程序只能用大写字符书写,而且每行前六个字符为特定用途所保留。第一列为字符 C 所保留,用来表征整行都是注释。第二列到第六列是为标号预留的。代码从第七列开始。下面是示例程序采用的是传统的 Fortran 格式:
C helloworld.f C PROGRAM HELLOWORLD WRITE(*,10) 10 FORMAT('hello, world') END PROGRAM HELLOWORLD
编译器 GCC 并不要求所有代码都大写,但是,除非有其他说明,这种固定的格式都是要求的。下面的命令将该程序编译成可执行文件:
$ g77 helloworld.f -o helloworld
命令 g77 是设置过 Fortran 程序所需基本环境的 gcc 的一个前端。同样的结果可以通过下面 gcc 的命令来实现:
$ gcc helloworld.f -lfrtbegin -lg2c -lm -shared-libgcc -o helloworld
库文件 libfrtbegin.a (通过命令行选项 -lfrtbegin 被调用) 包含运行和终止一个 Fortran 程序所必须的开始和退出代码。库文件 libg2c.a 包含 Fortran 底层的输入输出等所需要的运行函数。库文件 libm.a 是系统数学库。选项 -shared-libgcc 指定使用共享的标准库 libgcc。
GCC 也允许用自由的格式书写 Fortran 代码。注释以感叹号(!)开始直到行尾。先前的程序采用自由格式重写如下,其中语句、标号都可从任一列开始:
! helloworldff.f ! Program Helloworld write(*,10) 10 format('hello, world') end Program Helloworld
该程序通过在命令行中加入选项 -ffree-form 进行编译,如下:
$ g77 -ffree-form helloworldff.f -o helloworldff
由于两种格式的具有很大的区别,程序书写是只能选择其中的一种格式进行书写。
gfortran
- gfortran 默认会将 .f, .for, .fpp, .ftn, .F, .FOR, .FPP 和 .FTN 结尾的文件作为固定格式处理,而将.f90, .f95, .f03, .F90, .F95 和 .F03 结尾的文件作为自由格式来处理。
- 对于大写的后缀名 gfortran 将调用编译预处理器进行处理,而以小写的 .fpp 结尾的也会先进行编译预处理。
多个源文件生成可执行程序
命令 g77 可将多个 fortran 源码文件编译链接成为一个单一的可执行程序。下面列出了一个保存在文件 caller.f 中的简单程序的主体部分,它调用一个函数并显示出结果:
C caller.f C PROGRAM CALLER I = Iaverageof(10,20,83) WRITE(*,10) 'Average=', I 10 FORMAT(A,I5) END PROGRAM CALLER
名为 Iaverage 函数定义在另一个独立的源文件中,如下:
C called.f C INTEGER FUNCTION Iaverageof(i,j,k) Iaverageof = (i + j + k) / 3 RETURN END FUNCTION Iaverageof
通过下面的语句这两个源码文件可被编译链接成一个名为 caller 的可执行程序:
$ g77 caller.f called.f -o caller
同样的结果可由下面的命令序列得到──先将每一个源码文件编译成对象文件,而后将对象文件链接为可执行程序:
$ g77 -c caller.f -o caller.o $ g77 -c called.f -o called.o $ g77 caller.o called.o -o caller
生成汇编代码
选项 -S 指示编译器 g77 生成汇编语言代码然後结束。要得到我们本文先前的 helloworld.f 例子的汇编代码,只需输入以下命令:
$ g77 -S helloworld.f
生成的汇编语言文件名为 helloworld.s。汇编语言的具体形式依赖于编译器的目标平台。
编译预处理
编译以 .F,.fpp 或者 .FPP 结尾的文件时,在它真正编译之前需要预处理。预处理器原本是为协助 C 语言工作所设计的。下面的例子是一个自由格式的 Fortran 程序,它通过预处理器将一个函数包含进主程序:
! evenup.F ! #define ROUNDUP #include "iruefunc.h" ! program evenup do 300 i=11,22 j = irue(i) write(*,10) i,j 300 continue 10 format(I5,I5) end program evenup
函数 irue() 的源代码保存在文件 iruefunc.h 中,根据宏 ROUNDUP 所定义的值的不同将产生不同的编译结果。该函数将任何一个奇数近似为一个偶数。默认情况下,它向下取近似,但是当 ROUNDUP 被定义时,该函数将向上取近似而得到一个偶数。ireu() 的函数体如下:
integer function irue(i) k = i / 2 k = k * 2 if (i .EQ. k) then irue = i else #ifdef ROUNDUP irue = i + 1 #else irue = i - 1 #endif end if end function irue
下面的命令将该程序编译成可执行文件:
$ g77 -ffree-form evenup.F -o evenup
采用自由格式写程序以利用预处理器不是必须的。固定格式程序也可进行编译预处理,下面的程序也是有效的:
C adder.F C #define SEVEN 7 #define NINE 9 C program adder isum = SEVEN + NINE write(*,10) isum 10 format(I5) end program adder