从目标构建的问题 - Makefile

Problems with building from target - Makefile

这可能是一个非常愚蠢的问题,但我从来没有真正以复杂的方式使用过 Makefile,在我第一次尝试 "step it up" 我 运行 进入以下问题时:

我有 4 个目标,其中 运行 是我要调用来构建源代码的目标。

原理结构如下:

run: source exec

source:
    $(eval SOURCE := file1.f90)
    $(eval SOURCE += file2.f90)
    ...
    $(eval OBJECTS := $(SOURCE:%.f90=%.o))

exec: $(OBJECTS)
    $(FC) $(FLAGS) -o $@ $(OBJECTS)

%.o: %.f90
    $(FC) -c $(FLAGS) -o $@ $<

据我从手册中了解到,编译目标代表一个隐式规则,一旦调用 exec,所有 "missing" 对象都应该生成。不幸的是,我收到无法找到目标文件的错误 ifort: error #10236: File not found: 'file1.o'(因为没有编译),现在我想知道我做错了什么?

感谢任何帮助!

您的 source 规则不正确。这些分配不应该在规则中。并且由于您正在对源名称进行硬编码,因此您也可以改为对对象名称进行硬编码:

OBJECTS := file1.o
OBJECTS += file2.o
...

接下来的两条规则看起来是正确的,但您可以在 exec 规则中使用 $^

exec: $(OBJECTS)
    $(FC) $(FLAGS) -o $@ $^

%.o: %.f90
    $(FC) -c $(FLAGS) -o $@ $<

那么run规则(应该是第一个)可以这样:

run: exec
    ./$@

我不使用 Fortran,所以我没有测试过这个;如果它不起作用,请在评论中告诉我们确切的错误消息,我们将进行故障排除。