幻灯片的制作-没有找到d3dx9_42 dll

pgf文件
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文件