幻灯片的制作-没有找到d3dx9_42 dll
![pgf文件](/uploads/image/0454.jpg)
2023年3月31日发(作者:录屏设置)
在linux下如何使⽤Makefile对fortran程序进⾏编译
在linux下写过不少的fortran,但很少写makefile⽂件,通常情况下我是⼿动⽤ifort或pgf90进⾏编译,虽然也在⼤型中写过⼀些代码,但
因为都有现成的makefile⽂件,我也只是修改⼀下配置参数,先makeclean,再make,只要⽣成可执⾏就算搞定了。今天⼼⾎来潮,⾃⼰
写了⼏个Makefile,供⼤家参考。
⼀、不⽤Makefile的直接编译
⽐如有2个简单程序,主程序为main.F90,⼦程序为sub.F90.如果直接编译的话,键⼊
ifortmain.F90sub.F90
就可以⽣成⼀个⽂件,即为可执⾏程序了。
你也可以指定⼀个可执⾏程序的名字,如
则可以⽣成,实际上与是⼀样的。
当然,如果你不喜欢⽤⼦程序,或者⼦程序和主程序都写在⼀个F90⽂件中(如main.F90),上述的编译语句直接省掉sub.F90就⾏了,但
不推荐这样写程序,特别是程序⽐较⼤的情况下,⼀是程序间的关系容易理不清,另外风险也⼤,万⼀哪天把程序删掉了或改错了,损失可
就⼤了。
上⾯的编译也可以分两步进⾏,
ifort-cmain.F90sub.F90
.o
第⼀⾏称为编译compile,第⼆⾏称为链接link。这个过程最后还是⽣成,第⼀步⽣成main.o和sub.o两个⽬标⽂件,第⼆步将⽬标
⽂件链接成可执⾏⽂件。这看起来有点多此⼀举,如果在程序不⼤,⼦程序不多的情况下,这确实是浪费体⼒,但如果有⼏⼗或⼏
百个⼦程序(如WRF模式),编译⼀次可能要花⼏⼗分钟或⼏个⼩时,那么可以单独编译修改的那个程序⽣成相应的.o⽂件就⾏了,然后再
执⾏第⼆步链接,这样可以节省不少时间。也就是说,第⼀步的编译可以分开进⾏:
ifort-cmain.F90
ifort-csub.F90
在有⼏个⼦程序的情况下,这样分开编译虽然花点⼯夫,还是值得的,因为程序很难⼀蹴⽽就,总要调试,总要修改,分解成若⼲⼦程序逐
个编译更容易各个击破。
⼆、简单的Makefile⽂件
我们仍以⼀⾏编译语句为例,将其写在Makefiel⽂件中。使⽤vi建⽴⼀个新的Makefile⽂件,在其中写⼊:
:main.F90sub.F90
就可以了。你把已有的删掉,键⼊make,你会发现⽣成了新的.这就是Makefile⽂件了,简单吧!
如果报错的话,你看看是不是Makefile中的第⼆⾏之前没有⽤tab键空格,必须⽤tab键,⽤空格键是不⾏嘀。
下⾯我们再来解释⼀下Makefile的写作格式
简⽽⾔之,Makefile的格式就是⼆⾏,第⼀⾏定义⽬标⽂件和依赖⽂件,:之前的为⽬标⽂件,:之前后的main.F90和sub.F90为
依赖⽂件。第⼆⾏为执⾏语句,与⼿动编译相同。好像第⼀⾏还是多此⼀举,还不如⼿动编译只要⼀⾏就搞定,我们看完下⼀个例⼦再来讨
论这⼀点。
那么对于编译和链接分解的语句如何写呢。重新打开Makefile⽂件,将原来的两⾏删去,再写⼊:
:.o
.o
main.o:main.F90
ifort-cmain.F90
sub.o:sub.F90
ifort-csub.F90
这就可以了,是不是还发现⼀点异样?语句的顺序和前⾯⼿动编译时是反的,先是链接语句,后是编译语句,这⼀点我们稍后解释。还是先
运⾏⼀下吧,将原来的.exe和.o⽂件都删掉,执⾏make后,是不是可以看到新⽣成了.o和.exe⽂件。你还可以试试将其中的main.F90进⾏修
改(⽐如加⼀⾏空格,或加⼀条注释),再执⾏make,可以发现,仅更新了main.o和,⽽sub.o还是原来的⽣成时间。这就是
make的优势。
我们先来解释⼀下⽬标⽂件和依赖⽂件的关系,如果任意⼀个依赖⽂件发⽣了改变,则要运⾏下⼀⾏的执⾏语句,即⽣成新的⽬标⽂件,否
则跳过执⾏⽂件。在make执⾏的过程中,实际上并不是顺序执⾏的,⽽是先把所有的⽬标⽂件和依赖⽂件检查⼀遍,从最顶层的⽬标⽂件
开始,再分解检查各个⼦⽬标,将发⽣变化的依赖⽂件标记下来,然后再从下向上执⾏标记语句,最后更新顶层的⽬标⽂件。所以写
makefile⽂件的顺序必须是先写顶层的⽬标⽂件,也就是连接⽣成的.exe⽂件,然后再分别写编译要⽣成的.o⽂件,这与⼿动编译时是不同
的。make的⼯作⽅式就象警察办案⼀样,先侦察推演,收集证据;再顺藤摸⽠,收⽹抓贼。
三、复杂⼀点的Makefile⽂件
下⾯这个例⼦中⽤到了变量定义和静态模式
SOURS=main.F90sub.F90
OBJS=.o
BIN=
F90=ifort
${BIN}:${OBJS}
${F90}-o${BIN}${OBJS}
${OBJS}:%.o:%.F90
${F90}-c$<
先来说说变量定义,这个地球⼈都知道,只要会写shell脚本的⼈都能看的懂,如果⼦程序不多的话也没必要定义来定义去的。
更多推荐
pgf文件
发布评论