查看“Compiling Fortran”的源代码
来自Ubuntu中文
←
Compiling Fortran
跳到导航
跳到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
{{TOCright}} == 写在前面 == '''注意''':本文是关于 gfortran 的文章。如果你不清楚 gfortran,g77,g95 等等的概念的话,不妨看看[[Gcc Fortran Intro|GCC 的 Fortran 语言编译器介绍]];如果你要用 g77 的话,这是一篇[[Compiling Fortran77|g77入门]]。 == Fortran 编程中相关文件后缀 == <table border="1"> <tr><td>'''.a'''</td><td>静态库 (archive)</td></tr> <tr><td>'''.f''', '''.for''', '''.FOR'''<br>'''.ftn'''*, '''.f90'''*, '''.f95'''*, '''.f03'''*</td><td>Fortran源代码(不需编译预处理)</td></tr> <tr><td>'''.F''', '''.fpp''', '''.FPP'''<br>'''.FTN'''*, '''.F90'''*, '''.F95*''', '''.F03'''*</td><td>Fortran源代码(需要编译预处理)</td></tr> <tr><td>'''.r'''</td><td>Fortran源代码(需要RatFor编译预处理)</td></tr> <tr><td>'''.o'''</td><td>对象文件</td></tr> <tr><td>'''.s'''</td><td>汇编语言代码</td></tr> <tr><td>'''.so'''</td><td>动态库</td></tr> </table> 其中,标 '''*''' 的后缀名是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 ==其他参考== {{gccmorerefer}}
该页面使用的模板:
模板:Gccmorerefer
(
查看源代码
)
模板:TOCright
(
查看源代码
)
返回
Compiling Fortran
。
导航菜单
页面操作
页面
讨论
阅读
查看源代码
历史
页面操作
页面
讨论
更多
工具
个人工具
登录
导航
首页
最近更改
随机页面
页面分类
帮助
搜索
编辑
编辑指南
沙盒
新闻动态
字词处理
工具
链入页面
相关更改
特殊页面
页面信息