Makefile 向隐式规则的所有用途添加依赖项

Makefile 向隐式规则的所有用途添加依赖项,makefile,gnu-make,Makefile,Gnu Make,我有一个makefile,可以使用现有的%.c到%.o将c文件编译成目标文件 但是,我希望使用此隐式规则构建的所有.o文件也依赖于附加的头文件foo.h 我知道我可以添加额外的一次性规则,使单个.o文件依赖于foo.h,例如: bar.o : foo.h 。。。但是我想添加foo.h作为从.c文件生成的所有.o文件的依赖项 与上述类似,我尝试了以下方法: %.o : %.c foo.h 这是: %.o : foo.h 看看是否可以“添加”依赖项,但保留隐式规则 它不起作用。我当然可以将配方

我有一个makefile,可以使用现有的
%.c
%.o
将c文件编译成目标文件

但是,我希望使用此隐式规则构建的所有
.o
文件也依赖于附加的头文件
foo.h

我知道我可以添加额外的一次性规则,使单个
.o
文件依赖于
foo.h
,例如:

bar.o : foo.h
。。。但是我想添加
foo.h
作为从
.c
文件生成的所有
.o
文件的依赖项

与上述类似,我尝试了以下方法:

%.o : %.c foo.h
这是:

%.o : foo.h
看看是否可以“添加”依赖项,但保留隐式规则

它不起作用。我当然可以将配方从隐式规则复制粘贴到我的模式规则中,如下所示:

%.o : %.c foo.h
    $(CC) -c $(CPPFLAGS) $(CFLAGS) $<
%.o:%.c foo.h
$(CC)-c$(CPPFLAGS)$(CFLAGS)$<

但如果可能的话,我不想复制它。

您的困难在于如何处理模式规则。要强制考虑<代码> fo.h < /C>作为所有对象文件的先决条件,必须显式列出对象文件,而不依赖于模式规则。但是make提供了一种方法:静态模式规则,它看起来像一个模式规则,但更像是一组类似规则的紧凑形式。例如:

OBJS    := $(patsubst %.c,%.o,$(wildcard *.c))

$(OBJS): %.o: foo.h
唯一的限制是必须找到一种方法来枚举所有对象文件。这通常不是一个真正的问题

请注意,在您的特定情况下,甚至不需要模式功能,因为所有目标的先决条件都是相同的。您还可以使用:

OBJS    := $(patsubst %.c,%.o,$(wildcard *.c))

$(OBJS): foo.h

谢谢我想这与复制隐式规则差不多。@BeeOnRope我认为它与。请参阅步骤4…引用手册:“它们比具有多个目标的普通规则更通用,因为目标不必具有相同的先决条件。”。。。但是由于本例中的先决条件是相同的,因此我认为使用静态模式规则与普通的
$(OBJS):foo.h
相比没有任何优势。我错过了什么吗?@Vroomfondel你是对的,在这种情况下,它相当于标准的非模式规则。我提到了静态模式规则,因为原始模式也是基于模式的,而且静态模式规则很好理解。编辑了我的答案,包括你的评论。