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 *~

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

最佳答案

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

%.mod: %.90
    $(gg) -c  $^

这将在大多数情况下有效,但并非全部。这是因为mod文件的名称仅取决于模块名称,而与源文件名称无关。因此,最安全的方法是显式指定依赖项。
matrix.mod: matrix.f90
    $(gg) -c matrix.f90

有时,一个f90源文件可以包含两个或多个模块。
matrix33.mod matrix99.mod: matrix.f90
    $(gg) -c matrix.f90

关于makefile - 如何使用模块为Fortran编写Makefile?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36970443/

10-11 16:51