Makefile Fortran生成文件

Makefile Fortran生成文件,makefile,fortran,fortran90,Makefile,Fortran,Fortran90,我有以下问题。 我有一套Fortran90源文件,其中大部分包含模块。 我必须用它们构建一个静态库(.a),我使用了下面的Makefile .SUFFIXES: .o .c .f90 .f .mod DEPSF = tt_f90m, bt include Makefile.in #Contains compiler flags (CC, FORT, etc.) OBJS = $(DEPSF:,=.o).o mytt.a: $(OBJS) ar rc mytt.a $(OBJS)

我有以下问题。 我有一套Fortran90源文件,其中大部分包含模块。 我必须用它们构建一个静态库(.a),我使用了下面的Makefile

.SUFFIXES: .o .c .f90 .f .mod

DEPSF =   tt_f90m, bt
include Makefile.in #Contains compiler flags (CC, FORT, etc.)
OBJS    = $(DEPSF:,=.o).o

mytt.a: $(OBJS) 
 ar rc mytt.a $(OBJS)
.f90.o:
    $(FORT) -c $<

如何正确编写此生成文件?

您没有将
.mod
文件上的
.f90
.f
文件的依赖关系放入您的生成文件中。如果您更新以
.f
.mod
.c
结尾的文件之一,make看不到您的
.a
文件依赖于它,并且不必重新编译
.f90
文件

您有几个选项可以修复此问题。一种是使用像这样的工具。MakeDependen本身仅适用于C,但fortran版本存在

另一个是在makefile中显式声明哪些对象文件依赖于哪些模块和C文件。它看起来有点像这样:

.SUFFIXES: .o .c .f90 .f .mod

DEPSF =   tt_f90m, bt
include Makefile.in #Contains compiler flags (CC, FORT, etc.)
OBJS    = $(DEPSF:,=.o).o

mytt.a: $(OBJS) 
    ar rc mytt.a $(OBJS)

ttf90m.o: bt.f90 foo.mod bar.f
    $(FORT) -c $< -o $@

bt.o: ttf90m.f90 baz.mod floop.c
    $(FORT) -c $< -o $@    
。后缀:.o.c.f90.f.mod
DEPSF=tt_f90m,英国电信
include Makefile.in#包含编译器标志(CC、FORT等)
OBJS=$(DEPSF:,=.o).o
mytt.a:$(OBJS)
应收账款多年电价调整数美元(OBJS)
ttf90m.o:bt.f90 foo.mod bar.f
$(堡垒)-c$<-o$@
bt.o:ttf90m.f90 baz.mod floop.c
$(堡垒)-c$<-o$@

事实上,我已经找到了这个问题的答案。 问题出在Fortran90上。 它将.mod文件作为依赖项,因此如果源文件发生更改,.mod 文件不存在,并且不会重新编译文件。解决方案非常简单。 刚开始的时候就写

.SUFFIXES:
.SUFFIXES: .c .f .f90 .F90 .o

就这些

我不喜欢吹毛求疵,但在你的问题中有一个很长的重复性错误信息,这使得阅读起来有点困难。将来,你可能想找出你收到的错误信息中的模式,并且只发布几行。我同意,我编辑了这个问题,我将看一看。建议的变体(对.o文件的依赖关系)很好。但是如果我有,比如说50个源文件,并且只想在“DEPSF”中列出它们呢。我非常确信上述解决方案对于F77文件(没有模块)是理想的。当相应的源文件更改时,我可以告诉makefile重新生成.o吗?您也可以添加模式规则,是的。但是您必须知道,当使用模式规则编译的文件的一个依赖项发生变化时,它们不会被重新编译。那么,唯一的事情是fortran的MakeDependent吗?@Ivan Oseledets:是的,或者是像GNU Automake这样的更时髦的东西(它为您生成整个makefile)。不过,我从未使用过Automake,我也听到过一些抱怨,说它很难使用。对我来说也很有用,谢谢!关于这里到底发生了什么有什么智慧的话吗?空白后缀行的作用是什么?空白后缀行清除先前定义的所有后缀。
.SUFFIXES:
.SUFFIXES: .c .f .f90 .F90 .o