Fortran含Module情况下Makefile文件书写

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Fortran含Module情况下Makefile文件书写

解决方法:

1.把含Module的文件命名为.module文件,且module名字和文件名相同,一个文件里只写一个Module。

2.编译时要用-x f95来说明它是fortran 95格式,而编译其它文件f90文件到.o目标文件时,只编译依赖的f90文件(不然会有warning,反正我不喜欢有这个东西)

特此发博文记录下(注意红色部分):

#Compiler and Compile options

FC=gfortran

CFLAGS = -O2

#Source code files, Object files and Target(Executable) file define

SRCS = $(wildcard *.f90)

OBJS = $(SRCS:.f90=.o)

TARGET = api

MODSRCS = $(wildcard *.module)

MODOBJS = $(MODSRCS:.module=.o)

MODS = $(MODSRCS:.module=.mod)

#Debug purpose.

#all:

# @echo $(SRCS)

# @echo $(MODOBJS)

#Generate Target file using Object files

$(TARGET): $(OBJS) $(MODOBJS)

$(FC) $(CFLAGS) $^ -o $@

#Generate Object files using Source code files

%.o: %.f90 $(MODS)

$(FC) $(CFLAGS) -c $<

$(MODS) $(MODOBJS): $(MODSRCS)

$(FC) $(CFLAGS) -x f95 -c $^

##Use "make run" can run the Target file

run:

@./$(TARGET)

#Clean the Object files

clean:

rm $(OBJS) $(MODOBJS) $(wildcard *.mod)

#Clean both the Object files and Target file

clean-all:

rm $(TARGET) $(OBJS) $(MODOBJS) $(wildcard *.mod)

(如果你要复制上面的代码,记得把编译规则(:的下一行)前面的加Tab)

中间用到通配符,变量,搜索一类文件的功能,还有变量替换。

%.o: %.module以及%.o: %.module比较省事,或以把一类目标文件从其依赖的文件类型按定义的规则进行编译。

$(wildcard *.c)所有当前目录下的.c结尾的文件

变量替换嘛,可以用patsubst, substs以及我用到的":=",初次接触,不大会用,所以有中间的debug,输出变量看是不是对的。

Makefile我目前了解的一个好处就是:文件很多时,不用每次都去编译所有的文件(本来我都是用include包含在一个文件里)。

题外话:Fortran中有Module,make的时候老有错,说Module没定义,我不知道这个原因该是怎么的。把Module的文件单独写出来,进行编译,可是这样还是不行,很多module

的时候也很麻烦。我们把依赖的mod写出来,发现它实际上在编译成目标文件的时候又用不到。关键似乎是要有.mod的文件,知道这个.o文件依赖于哪个.mod文件。我干脆把含module的f90文件改成以.module结尾了,不过这样编译时要用-x f95来说明它是fortran 95文件,而编译其它文件f90文件到.o目标文件时,只编译依赖的f90文件(全编译却有warning 说:.mod文件没用到,因为没有进行链接!)。哈哈,解决了含Module文件的编译问题!

缺点:

1.名字必须和文件中的module名字一样,还每一个文件中只能有一个module。

2.要是几百个这样的含Module的文件,它们原来的名字都是f90,那还得用脚本自己改了,还是麻烦。

逻辑有点扯:编译成目标文件的时候似乎不需要.mod,但是又要知道它依赖于哪个.mod文件以及这个.mod文件怎么编译。而我们在Target依赖的文件$(MODOBJS),却可以不必要知道它怎么编译……

不明白,为什么fortran的module要先生成一个.mod文件,为什么不直接写在.o文件里?!***************************************************************************

其实,gfortran -c 时,只需要对应的.mod文件,因此要先编译出.mod文件,但链接ld时,需要mod对应的.o文件。因此,makefile里面写的顺序是:

test: $(obj)

gfortran -o $@ $(obj)

$(obj): %.o : %.f90

gfortran -c $<

这里的obj要包括生成模块的那些目标文件。

相关文档
最新文档