从目标构建的问题 - Makefile

时间:2017-10-03 13:41:06

标签: makefile fortran gfortran

这可能是一个非常愚蠢的问题,但我从未真正以复杂的方式使用Makefiles,而且在我第一次尝试“加强”时遇到了以下问题:

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

  • 运行>主要目标
  • exec >构建可执行文件
  • %。o >应该编译源
  • 来源>连接源文件

原则中的结构如下:

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 就应该生成所有“缺失”对象。不幸的是,我收到了无法找到目标文件的错误ifort: error #10236: File not found: 'file1.o'(因为没有编译),现在我想知道我做错了什么?

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

您的source规则不正确。这些任务不应成为规则。由于您对源名称进行了硬编码,因此您也可以改为对代码名称进行硬编码:

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

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

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

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

然后run规则(应该是第一个)可以是这样的:

run: exec
    ./$@

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