为什么我的Makefile在使用Makefile时没有生成*.mod

为什么我的Makefile在使用Makefile时没有生成*.mod,makefile,module,fortran,Makefile,Module,Fortran,我正在尝试制作简单的Makefile来构建我的程序 我的Makefile文件如下: main.f是主要的源代码,test1.f是模块 default: test.out test.out : main.o test1.o gfortran main.o test1.o -o test.out test1.o: test1.f gfortran -c test1.f main.o: main.f gfortran -c main.f clean : rm

我正在尝试制作简单的Makefile来构建我的程序

我的
Makefile
文件如下:

main.f
是主要的源代码,
test1.f
是模块

default: test.out

test.out : main.o test1.o
    gfortran main.o test1.o -o test.out

test1.o: test1.f
    gfortran -c test1.f

main.o: main.f
    gfortran -c main.f


clean :
    rm -f ./*.out
    rm -f ./*.o
    rm -f ./*.mod
当我在终端中命令
make
时,它会给我一个错误

Fatal Error: Cannot open module file 'test1.mod' for reading at (1): No such file or directory
(1) 显示错误发生的位置。在我定义使用模块test1的主源文件行中 i、 e.
使用test1

如果我命令
gfortran-ctest1.f
,那么命令
make
将构建可执行文件,而不会出现任何问题


我的问题是,即使我在模块的Makefile中编写了生成目标文件的行,为什么它不起作用?

您的Makefile依赖项是错误的。您需要在main.f90之前编译test1.f90。因此,将
test.out:main.o test1.o
更改为
test.out:test1.o main.o

谢谢!即使在依赖项部分,我也不知道依赖项的顺序很重要。谢谢你,伙计!这不是最好的方法。只是在依赖项列表中按不同的顺序排列并不能保证第二个依赖项会等待第一个依赖项完成。如果运行
make-j
,您的makefile仍将失败。如果
main.o
目标依赖于
test1.o
目标的输出,则必须通过添加一个先决条件行告诉make这是一种情况:
main.o:test1.o
。现在,无论它们在先决条件中列出的顺序如何,make都知道它们相互依赖。当Makefile只有两个文件时,为什么要使用-j呢?也不知道为什么会有反对票。我回答的第一句话是无可争辩的。从技术上讲,@madscitist的评论也是不正确的。main.f取决于是否存在
test1.mod
。一个人需要有
main.o:test1.mod
test1.mod:test1.f
,在新的子模块世界秩序中,一个人可能需要涉及
*.smod
文件的附加依赖项。Downvote不是我。但是,源文件不能依赖于生成的文件。您无法重建源文件,因为它没有配方,所以它不能有先决条件。就像
.c
文件不依赖于
.h
文件一样;
.o
依赖于
.h
,即使
.c
包括
.h
。而且,仅仅因为这个例子只有两个文件并不意味着真正的版本不会有更多的文件。无论哪种方式,正确地编写makefile(并理解为什么它是正确的)都是有价值的,即使结果是相同的。