查看“Compiling Fortran”的源代码
来自Ubuntu中文
←
Compiling Fortran
跳到导航
跳到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{TOCright}} == 写在前面 == 对 fortran 这一块我现在有点乱^_^,有错的地方望大家及时指正。 在gcc4.0以前,gcc绑定的fortran编译器是g77(尽管现在g77已不再被维护,但它可能仍是应用最广的fortran编译器),从gcc4.0开始,gcc开始绑定fortran编译器gfortran(由于g95是另一个由他人维护的fortran编译器,所以gnu选择了gfortran这个名字)。 '''注意:'''没有特殊说明的话,文本介绍的是g77编译器,文中的 gcc 指的也是 gcc4.0之前的版本。 == Fortran 编程中相关文件后缀 == *'''对 g77 编译器:''' '''.a''' 静态库 (archive)<br> '''.f, .for, .FOR''' Fortran源代码(不需编译预处理)<br> '''.F, .fpp, .FPP''' Fortran源代码(需要编译预处理)<br> '''.r''' Fortran源代码(需要RatFor编译预处理)<br> '''.o''' 对象文件 <br> '''.s''' 汇编语言代码<br> '''.so''' 动态库<br> *'''对 gfortran 编译器:''' 相对与g77, gfortran还可以识别以下的文件后缀: '''.ftn, .f90, f95, f03''' Fortran源代码(不需编译预处理)<br> '''.FTN, .F90, F95, F03''' Fortran源代码(需要编译预处理)<br> == 单个源文件生成可执行程序 == 传统的 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 ==其他参考== *[[Compiling C|C编译初步]] *[[Compiling Cpp|C++编译初步]] *[[Gcchowto|GCC新手入门]]
该页面使用的模板:
模板:Gccmorerefer
(
查看源代码
)
模板:TOCright
(
查看源代码
)
返回
Compiling Fortran
。
导航菜单
页面操作
页面
讨论
阅读
查看源代码
历史
页面操作
页面
讨论
更多
工具
个人工具
登录
导航
首页
最近更改
随机页面
页面分类
帮助
搜索
编辑
编辑指南
沙盒
新闻动态
字词处理
工具
链入页面
相关更改
特殊页面
页面信息