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