如何使用模块为 Fortran 编写 makefile?

Ter*_*iao 5 fortran makefile

gg=mpif90
DEPS=matrix.mod
OBJ=  main.o sub1.o

main.out: $(OBJ)
    $(gg) -o $@ $^
%.mod:%.90 %.o
    $(gg) -c -o $@ $^

%.o:%.f90 $(DEPS)
    $(gg) -c -o $@ $^

.PHONY: clean

 clean:
    -rm -f *.o *~
Run Code Online (Sandbox Code Playgroud)

看。主要程序是main.f90. sub1.f90将被调用main.f90。两者都将使用matrix.f90which 是一个模块。我知道我可以直接生成可执行程序而无需compile then link. 但我不喜欢那样。

gdl*_*lmx 2

mod文件只是编译的副产品%.o,你不应该-o $@在这里使用,将其更改为

%.mod: %.90
    $(gg) -c  $^
Run Code Online (Sandbox Code Playgroud)

这适用于大多数情况,但并非全部。这是因为文件名mod仅取决于模块名称,与源文件名无关。因此,最安全的方法是显式指定依赖关系。

matrix.mod: matrix.f90
    $(gg) -c matrix.f90
Run Code Online (Sandbox Code Playgroud)

有时一个f90源文件可以包含两个或多个模块。

matrix33.mod matrix99.mod: matrix.f90
    $(gg) -c matrix.f90
Run Code Online (Sandbox Code Playgroud)