1

我正在尝试编写一个 Fortran 生成文件:只有一个“主”文件,但我已将模块放在单独的 .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

为什么在没有进行任何更改的情况下重新编译“新”?

4

2 回答 2

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 $<
于 2013-03-12T16:58:24.877 回答
1

根据您的Makefile,new.o取决于ALE.modand curvilinear.mod

我猜这些文件永远不存在,因为它们有依赖关系,但没有规则来制作它们。

确实,在尝试构建new时,make没有找到*.mod文件。因此,make运行规则来制定它们,但没有规则。但是,make认为它已经构建了它们,并继续构建操作,认为这些*.mod依赖关系刚刚重建,因此是最近的,从而触发了new.

要解决此问题,您应该替换该行

new.o: ALE.mod curvilinear.mod new.f90

经过

new.o: new.f90
于 2013-03-12T16:20:08.080 回答