Fortran含Module情况下Makefile文件书写

转载于: http://blog.sina.com.cn/s/blog_59cf67260100kzat.html


2012年10月11日补充:
Linux下用makefile编译含module的fortran源码时,第一次make会生成一个modulename.mod的文件,但同时会提示说找不到mod文件:
Fatal Error: Can'topen module file 'xxxx.mod' for reading at(1):没有那个文件或目录

解决这个问题的最简单的方法其实是:再make一遍!

另外一种就是:想办法把含module的文件先编译,比如说修改文件名命名,或者特殊地写出来!

原来一直用inlude来把很多文件包含在一个文件里,一直很想写Makefile来搞定这件事,今天终于搞定。没想到makefile还挺麻烦,不过很高兴地是自己采用一种特殊的办法,解决了含Module的文件的编译,而且是比较简单而通用的,对有很多含Module的文件同样适用。

解决方法:
1.把含Module的文件命名为.module文件,且module名字和文件名相同,一个文件里只写一个Module。
2.编译时要用-x f95来说明它是fortran95格式,而编译其它文件f90文件到.o目标文件时,只编译依赖的f90文件(不然会有warning,反正我不喜欢有这个东西)

特此发博文记录下(注意红色部分):
#Compiler and Compile options
FC=gfortran
CFLAGS = -O2

#Source code files, Object files and Target(Executable) filedefine
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结尾了,不过这样 编译时要用-xf95来说明它是fortran95文件,而编译其它文件f90文件到.o目标文件时,只编译依赖的f90文件(全编译却有warning说:.mod文件没用到,因为没有进行链接!)。哈哈,解决了含Module文件的编译问题!

  缺点:
1.名字必须和文件中的module名字一样,还每一个文件中只能有一个module。
2.要是几百个这样的含Module的文件,它们原来的名字都是f90,那还得用脚本自己改了,还是麻烦。

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

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

大家都在说Gfortran编译的程序执行效率不高,哪天应该测试一下。


  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值