加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

利用makefile编译Fortran程序的例子

(2018-11-06 12:07:38)

假设有四个文件,分别是:

main.f90 ; global.f90; function1.f90; subroutine1.f90

其中:

main.f90:包括主程序。它调用函数和子程序;

global.f90:用module定义一些全局变量(过程),这个module被main.f90以及    function1.f90中的function1 函数调用;

function1.f90:中包括一个函数function1,它被main.f90调用;

subroutine1.f90:中包括一个过程subroutine1,它也被main.f90调用;


1.直接生成可执行文件

假如我们手头上有一个intel的fortran编译器进行编译,就要采用如下命令:

ifort global.f90 main.f90 function1.f90 subrouine1.f90

这样会自动生成文件a.out,这是一个可执行文件。因为编译器将上述四个文件编译(compile)后生成目标文件(***.o),并将这几个目标文件自动连接起来(link)。同时我们会发现当前目录下多了如下几个文件:

global.o

 global.mod

 main.o

 function1.o

 subroutine1.o


 如果想让生成的可执行程序有一个名字,将命令改成

 ifort -o execname global.f90 main.f90 function1.f90 subrouine1.f90

即可。

输入命令

 ./execname

即可执行该程序。


2.分步进行

Build=Compile+Link。所以我们也可以不直接生成程序,而是先编译文件以产生目标文件(即不连接)。例:

ifort -c function1.f90

这个命令会生成与源程序(Source)function.f90相对应的目标文件(Object file)。

如果我们想要编译一个调用某module的程序,就必须先将module文件编译,顺序不能改变。例:

ifort -c global.f90

ifort -c main.f90

第一个命令生成两个文件:global.mod和global.o;在第二条命令,也就是在main.f90的编译过程中,需要用到global.mod文件。所以,这两条命令的顺序不能改变!

将四个文件编译后,即可连接:

ifort global.o main.o function1.o subroutine1.o

或者直接

ifort *.o

 

Tip:

 NOTE:(1)若是gfortran编译器,将以上所有ifort替换成gfortran即可

            (2)若所有的源文件都在一个文件夹中,生成可执行文件最快的方式是

ifort -c *.f90

ifort -o exename *.o


3.采用makefile

这是一个简单的makefile文件

# This is an commentary line in a makefile

# Start of the makefile

execname: global.o main.o function1.o subroutine1.o

   ifort -o execname global.o function1.o subroutine1.o main.o

global.mod: global.o global.f90

   ifort -c global.f90

global.o: global.f90

   ifort -c global.f90

main.o: global.mod main.f90

   ifort -c main.f90

function1.o: global.mod function1.f90

   ifort -c function1.f90

subroutine1.o: subroutine1.f90

   ifort -c subroutine1.f90

clean:

   rm global.mod global.o main.o function1.o subroutine1.o execname

# End of the makefile


说明:

makefile文件应命名为makefile,并将其防止在与源程序同一目录下。过长的句子可用 做换行符, # 后的句子为注释。

执行时,直接输入:

make

执行清除时,输入:

make clean

我的理解是这样的。举个例子,比如这两行:

execname: global.o main.o function1.o subroutine1.o

   ifort -o execname global.o function1.o subroutine1.o main.o3

其中,execname称为目标文件(target);冒号后的文件是产生这个文件的一些prerequisites(前提)。第二行是命令(command),跟在target和prerequisites之后,在其前加入Tab字符,以示区别。这些共同组成了规则(rule)。其实makefile所”make“的所有事情都是rule中具体化的命令。

clean并不是一个文件,而是一个行为(action)。默认不执行。它不包含任何前提(prerequisites)。我们称之为phony target(虚假目标)。

Tip

NOTE:

(1)第一行应定义可执行文件,并附加上它所需要的所有前提文件。

(2)定义目标文件时,应附加其所有mod文件,以及该mod文件所对应的object文件(***.o)。

 以上两条规则应时刻最遵守!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有