Compiling Fortran

目录

[隐藏]

  • 1 写在前面
  • 2 Fortran 编程中相关文件后缀
  • 3 单个源文件生成可执行程序
  • 4 多个源文件生成可执行程序
  • 5 生成汇编代码
  • 6 编译预处理
  • 7 理解gfortran是gcc的前端
  • 8 其他参考

[编辑] 写在前面

注意:本文是关于 gfortran 的文章。如果你不清楚 gfortran,g77,g95 等等的概念的话,不妨看看GCC 的 Fortran 语言编译器介绍;如果你要用 g77 的话,这是一篇g77入门。

[编辑] 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 程序(也就是以 Fortran 77 为代表的)只能用大写字符书写,而且每行前六个字符为特定用途所保留。第一列为字符 C 或 * 所保留,用来表征整行都是注释。第二列到第六列是为标号预留的。代码从第七列开始,到72列结束(73列及以后将被直接忽略,可作注释)。下面是示例程序采用的是传统的 Fortran 格式:

C   helloworld.f
CPROGRAM HELLOWORLDWRITE(*,10)10 FORMAT('hello, world')END PROGRAM HELLOWORLD

编译器 gfortran 并不要求所有代码都大写──程序中任何关键词都可以用小写字母。下面的命令将该程序编译成可执行文件:

$ gfortran helloworld.f -o helloworld

注意到:gfortran 默认会将 .f, .for, .fpp, .ftn, .F, .FOR, .FPP 和 .FTN 结尾的文件作为固定格式处理,而将.f90, .f95, .f03, .F90, .F95 和 .F03 结尾的文件作为自由格式来处理。如果我们将上面程序文件重命名为 helloworld.f90,那么我们必须手动指定其为固定格式:

$ mv helloworld.f helloworld.f90
$ gfortran helloworld.f90 -ffixed-form -o helloworld

Fortran 90及以后的标准允许并鼓励用自由的格式书写 Fortran 代码。注释以感叹号(!)开始直到行尾。先前的程序采用自由格式重写如下,其中语句、标号都可从任一列开始:

! helloworldff.f90
!
Program Helloworld
write(*,10)
10 format('hello, world')end Program Helloworld

后缀名为 .f90,故 gfortran 将其作为自由格式处理

$ gfortran helloworldff.f90 -o helloworldff

同样,如果将程序重命名为传统后缀名,那么要通过在命令行中加入选项 -ffree-form 进行编译,如下:

$ mv helloworldff.f90 helloworldff.for
$ gfortran -ffree-form helloworldff.for -o helloworldff

由于两种格式的具有很大的区别,程序书写是只能选择其中的一种格式进行书写。注意:遵守后缀约定是很重要的。

[编辑] 多个源文件生成可执行程序

命令 gfortran 可将多个 fortran 源码文件编译链接成为一个单一的可执行程序。下面列出了一个保存在文件 caller.f 中的简单程序的主体部分,它调用一个函数并显示出结果:

C   caller.f
CPROGRAM CALLERI = Iaverageof(10,20,83)WRITE(*,10) 'Average=', I10 FORMAT(A,I5)END PROGRAM CALLER

名为 Iaverage 函数定义在另一个独立的源文件中,如下:

C   called.f
CINTEGER FUNCTION Iaverageof(i,j,k)Iaverageof = (i + j + k) / 3RETURNEND FUNCTION Iaverageof

通过下面的语句这两个源码文件可被编译链接成一个名为 caller 的可执行程序:

$ gfortran caller.f called.f -o caller

同样的结果可由下面的命令序列得到──先将每一个源码文件编译成对象文件,而后将对象文件链接为可执行程序:

$ gfortran -c caller.f -o caller.o
$ gfortran -c called.f -o called.o
$ gfortran caller.o called.o -o caller

[编辑] 生成汇编代码

选项 -S 指示编译器 gfortran 生成汇编语言代码然後结束。要得到我们本文先前的 helloworld.f 例子的汇编代码,只需输入以下命令:

$ gfortran -S helloworld.f

生成的汇编语言文件名为 helloworld.s。汇编语言的具体形式依赖于编译器的目标平台。

[编辑] 编译预处理

编译以 .F, .fpp, .FPP, .FTN, .F90, .F95 和 .F03 结尾的文件时,在它真正编译之前需要预处理。预处理器原本是为协助 C 语言工作所设计的。下面的例子是一个自由格式的 Fortran 程序,它通过预处理器将一个函数包含进主程序:

! evenup.F90
!
#define ROUNDUP
#include "iruefunc.h"
!
program evenup
do 300 i=11,22j = irue(i)write(*,10) i,j
300 continue10 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) thenirue = i
else
#ifdef ROUNDUPirue = i + 1
#elseirue = i - 1
#endif
end if
end function irue

下面的命令将该程序编译成可执行文件:

$ gfortran evenup.F90 -o evenup

采用自由格式写程序以利用预处理器不是必须的。固定格式程序也可进行编译预处理,下面的程序也是有效的:

C adder.F
C
#define SEVEN 7
#define NINE 9
Cprogram adderisum = SEVEN + NINEwrite(*,10) isum10 format(I5)end program adder

下面的命令将该程序编译成可执行文件:

$ gfortran adder.F -o adder

[编辑] 理解gfortran是gcc的前端

像 g++ 一样,gfortran 也只是设置过 Fortran 程序所需基本环境的 gcc 的一个前端。本文一开始的例子我们可以通过下面 gcc 的命令来编译:

$ gcc helloworld.f -o helloworld -lgfortran -lgfortranbegin

库文件 libgfortranbegin.a (通过命令行选项 -lgfortranbegin 被调用) 包含运行和终止一个 Fortran 程序所必须的开始和退出代码。库文件 libgfortran.a 包含 Fortran 底层的输入输出等所需要的运行函数。当运行 gfortran 时,会自动链接这两个库。这和下面的命令是等价的:

$ gfortran helloworld.f -o helloworld

当我们运行 gfortran 时,实际上运行并不是这个编译器,而是编译器驱动器。该驱动器解析命令行中所给出的选项,然后才调用真正的编译器,汇编器和链接器。默认情况下,编译器驱动器根据命令行中给定的文件的后缀决定它自己下一步的动作:一个名为 foo.c 将传递给 C 编译器,而名为 foo.f95 的文件将传递给 Fortran 95 的编译器,等等。

理解了这一点,我们就可以知道 gcc helloworld.f 将自动调用 fortran 的编译器。只不过我们要为链接器指定必要的库。

理解了这一点,我们可以知道 gfortran helloworld.c 可以编译一个 c 程序,gfortran helloworld.cpp -lstdc++ 编译的是一个 C++ 程序。

Compiling Fortran相关推荐

  1. python编译器如何设置中文_如何使setup.py test使用特定的fortran编译器?

    我正在尝试测试一个包含一些f90文件的package.如果我构建或安装并指定fortran编译器,它可以正常工作.但是,当我尝试测试时,会出现以下错误:C:\Users\jsalvatier\work ...

  2. 多个python编译器指定_python – 如何让setup.py测试使用特定的fortran编译器?

    我正在尝试测试包含一些f90文件的package.如果我构建或安装并指定fortran编译器,它可以正常工作.但是,当我尝试测试时,我收到以下错误: C:\Users\jsalvatier\works ...

  3. GNU Make 使用手册!

    GNU Make 使用手册(中译版) 翻译:于凤昌 译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级 ...

  4. 10047.GNU Make 使用手册中译版(转)

    http://blog.chinaunix.net/resserver.php?blogId=2652&resource=gunmake.htm GNU Make 使用手册(中译版) 翻译:于 ...

  5. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  6. GNU Make 使用手册(中译版)

    如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级的Makefile文件.目前,在网上虽然有一些著作,但都不能全面的解释Linux源代码中各级的M ...

  7. Makefile-----GNU

    GNU Make 使用手册(中译版) 翻译:于凤昌 译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级 ...

  8. Linux中RPM 和 YUM 包管理详解

    概述 在本教程中,学习如何使用 RPM 和 YUM 工具管理 Linux 系统上的包.学习: 使用 RPM 和 YUM 安装.重新安装.升级和删除包. 获取 RPM 包的信息,包括版本.状态.依赖项. ...

  9. Domain Specific Compiling: 领域编译器发展的前世今生 • 面向AI的编译技术

    from: 领域编译器发展的前世今生 • 面向AI的编译技术 作者简介: 张朔铭,博士研究生,正在中国科学院计算技术研究所崔慧敏研究员指导下攻读计算机系统结构博士学位,目前主要的研究方向是AI编译. ...

最新文章

  1. 机器学习最常用的优化算法 — 梯度下降法
  2. R语言row.names函数为dataframe、matrix设置行名称实战
  3. iOS 去除按钮的按下效果(阴影)
  4. .NET WebAPI 用ExceptionFilterAttribute实现错误(异常)日志的记录(log4net做写库操作)
  5. VS2012创建ATL工程及使用MFC测试COM组件
  6. 基于SIFT特征的全景图像拼接
  7. Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】
  8. Asp.net 2.0生命周期
  9. css3在线快速制作工具
  10. 7-1 字符串的冒泡排序 (20 分)
  11. Codeforces Round #388 (Div. 2) C. Voting
  12. java交接文档_如何写好交接文档
  13. 汪磊老师整理的前端进阶课程目录
  14. 关于触摸板设备USB映射虚拟桌面的VID与PID
  15. SpringBoot 整合 ElasticSearch 实现京东搜索(手把手带你完成一个 “前后端分离项目”)
  16. k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC
  17. 关于trigger的muting table异常
  18. Axure RP9教程 内部框架
  19. pyqt5按钮拖拽,实现拖拽新增和拖拽移动
  20. 计算机技巧宣讲,PPT演讲技巧

热门文章

  1. 我妈妈的优点:做事情特别细致
  2. 转:手机流畅的决定性因素
  3. Win7与其它Windows的双系统问题
  4. Vant 1.6.11 发布,有赞轻量级移动端 Vue 组件库
  5. Python学习笔记__8章错误、调试和测试__8.1章错误处理
  6. 【Android】Android 8种对话框(Dialog)
  7. sql注入攻击与防御第二版读书笔记二——SQL盲注利用
  8. jQuery经典面试题及答案精选[转]
  9. oracle if-else sql 语句
  10. 基于.Net Remoting的项目总结报告