我正在尝试编写一个Fortran makefile:有一个“main”文件,但我已将模块放在单独的.f90文件中。附加的makefile工作,但即使我不做任何更改,它也会强制重新编译。我正在使用gfortan 4.7.2和GNU Make 3.81运行x86-64 Linux。
FC = gfortran
FCFLAGS += -ffree-line-length-none -finit-local-zero
#FCFLAGS += -fbounds-check -ffpe-trap=invalid
all: new
new: ALE.o curvilinear.o new.o
$(FC) $(FCFLAGS) -o new new.o ALE.o curvilinear.o
new.o: ALE.mod curvilinear.mod new.f90
$(FC) $(FCFLAGS) -c new.f90
ALE.o: ALE.f90
$(FC) $(FCFLAGS) -c ALE.f90
ALE.mod: ALE.o ALE.f90
curvilinear.o: ALE.o curvilinear.f90
$(FC) $(FCFLAGS) -c curvilinear.f90
curvilinear.mod: curvilinear.o curvilinear.f90
clean:
rm ale.mod curvilinear.mod ALE.o curvilinear.o new new.o
输出:
$ make clean
rm ale.mod curvilinear.mod ALE.o curvilinear.o new new.o
$ make
gfortran -ffree-line-length-none -finit-local-zero -c ALE.f90
gfortran -ffree-line-length-none -finit-local-zero -c curvilinear.f90
gfortran -ffree-line-length-none -finit-local-zero -c new.f90
gfortran -ffree-line-length-none -finit-local-zero -o new new.o ALE.o curvilinear.o
$ make
gfortran -ffree-line-length-none -finit-local-zero -c new.f90
gfortran -ffree-line-length-none -finit-local-zero -o new new.o ALE.o curvilinear.o
为什么在没有进行任何更改时会重新编译“new”?
答案 0 :(得分:2)
Didier的回答可能已经解决了你的问题,但我想为Fortran makefile添加一个漂亮而干净的建议(一个主程序的例子):
# Main program
all: program
program: mod1.o mod2.o mod3.o
# Fortran module dependencies
mod1.o: mod2.o mod3.o
# Binary/object rules
%: %.o
$(FC) $(FCFLAGS) -o $@ $^ $(LDFLAGS)
%.o: %.f90
$(FC) $(FCFLAGS) -c $<
答案 1 :(得分:1)
根据您的Makefile
,new.o
取决于ALE.mod
和curvilinear.mod
。
我猜这些文件从不存在,因为它们具有依赖关系,但没有规则来制作它们。
确实,在尝试构建new
时,make
未找到*.mod
个文件。因此,make
运行规则来制作它们,但没有规则。但是,make
认为它已构建它们,并继续构建操作,认为这些*.mod
依赖项只是重建,因此是最近的,触发了new
的重建。 / p>
要解决此问题,您应该替换
行new.o: ALE.mod curvilinear.mod new.f90
通过
new.o: new.f90