【发布时间】:2020-11-28 04:13:37
【问题描述】:
我一直无法弄清楚为什么我的 Makefile 没有重新编译一些 C 目标文件,即使在我编辑了作为这些目标文件的先决条件的头文件之后也是如此。
我怀疑我不明白如何处理多个匹配目标的情况。例如,我可以想出三个粗略的情况,按照复杂度递增的顺序,会出现这种混淆。
案例 1:琐碎
.PHONY: blah
blah:
[code to do something]
blah:
[code to do something else]
案例 2:一个目标规则比另一个更具体
a.out: source.o
source.o: source.c
[commands to build source.o]
%.o: %.c
[something else entirely]
# And does the order of these prerequisites matter?
案例 3:包含的 Makefile 具有多余的目标名称
现在,这是我目前遇到的问题。我的 Makefile 包括自动生成的 Makefile,每个 Makefile 都包含目标文件的先决条件。具体来说,它的结构如下:
DEPS = [list of prerequisite Makefiles to be auto-generated]
OBJS = [all the object files from other source files besides a.c]
a.out: a.o $(DEPS) $(OBJS)
[compile the .out from the .o files]
$(BUILD_DIR)/%.d: $(SRC_DIR)/%.c
[build the .d Makefile using gcc -MM]
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
[compile the target]
include $(DEPS)
这里,每个DEPS 都有一个$(BUILD_DIR)/%.o 形式的目标。因此,尽管 .d 文件中的目标除了$(SRC_DIR)/%.c 之外可能还有其他先决条件,但这个目标对于上面的目标文件来说是多余的。
Make 选择要处理的目标的政策是什么?这是否可以解释为什么我的 a.out 的目标文件没有被编译,即使我刚刚写入了作为目标文件(在其中一个包含的 Makefile 中)的先决条件的头文件,并且这个目标文件是a.out的前提条件?
【问题讨论】:
-
this 回答你的问题了吗?
-
问题很可能是您没有有多个匹配目标,因此您的先决条件不正确。但是,我们需要确定的所有信息都隐藏在您问题中的变量后面。在不知道
DEPS文件的结构和OBJS变量的内容的情况下,我们无法真正帮助您解决问题。如需有关自动生成先决条件的帮助,您可能还想查看make.mad-scientist.net/papers/… -
是的,雷诺回答了这个问题。你是对的,MadScientist。