首页 > 其他 > 详细

fortran程序makefile

时间:2017-03-01 20:36:56      阅读:436      评论:0      收藏:0      [点我收藏+]

原文来自http://marjan.fesb.hr/~psarajce/makefiles.html
这是一片介绍fortran程序makefile文件编写的文章。
正文:
 
  假设有四个文件,分别是:

  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
 
 技术分享

  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.o
3
其中,execname称为目标文件(target);冒号后的文件是产生这个文件的一些prerequisites(前提)。第二行是命令(command),跟在target和prerequisites之后,在其前加入Tab字符,以示区别。这些共同组成了规则(rule)。其实makefile所”make“的所有事情都是rule中具体化的命令。
clean并不是一个文件,而是一个行为(action)。默认不执行。它不包含任何前提(prerequisites)。我们称之为phony target(虚假目标)。
技术分享
NOTE:
(1)第一行应定义可执行文件,并附加上它所需要的所有前提文件。
(2)定义目标文件时,应附加其所有mod文件,以及该mod文件所对应的object文件(***.o)。
  以上两条规则应时刻最遵守!

fortran程序makefile

原文:http://www.cnblogs.com/zoghin/p/6485898.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!