利用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,它被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
即可。
输入命令
即可执行该程序。
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:
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
global.mod: global.o global.f90
global.o: global.f90
main.o: global.mod main.f90
function1.o: global.mod function1.f90
subroutine1.o: subroutine1.f90
clean:
# End of the makefile
说明:
makefile文件应命名为makefile,并将其防止在与源程序同一目录下。过长的句子可用 做换行符, # 后的句子为注释。
执行时,直接输入:
make
执行清除时,输入:
make clean
我的理解是这样的。举个例子,比如这两行:
execname: global.o main.o function1.o subroutine1.o
其中,execname称为目标文件(target);冒号后的文件是产生这个文件的一些prerequisites(前提)。第二行是命令(command),跟在target和prerequisites之后,在其前加入Tab字符,以示区别。这些共同组成了规则(rule)。其实makefile所”make“的所有事情都是rule中具体化的命令。
clean并不是一个文件,而是一个行为(action)。默认不执行。它不包含任何前提(prerequisites)。我们称之为phony target(虚假目标)。
Tip
NOTE:
(1)第一行应定义可执行文件,并附加上它所需要的所有前提文件。
(2)定义目标文件时,应附加其所有mod文件,以及该mod文件所对应的object文件(***.o)。

加载中…