我有一个 makefile,可以使用现有的 %.c
到 %.o
将 C 文件编译为目标文件。
但是,我希望使用此隐式规则构建的所有 .o
文件也依赖于附加 header 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) $<
但如果可能的话,我不想重复它。
最佳答案
您的困难在于 make 如何处理模式规则。要强制 make 将 foo.h 视为所有目标文件的先决条件,您必须显式列出目标文件,而不是依赖模式规则。但是 make 提供了一种方法来做到这一点:静态模式规则,它看起来像模式规则,但更像是一组类似常规规则的紧凑形式。示例:
OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
$(OBJS): %.o: foo.h
唯一的限制是您必须找到一种方法来枚举所有目标文件。这通常不是一个真正的问题。
请注意,在您的具体情况下,甚至不需要模式功能,因为所有目标的先决条件都是相同的。您还可以使用:
OBJS := $(patsubst %.c,%.o,$(wildcard *.c))
$(OBJS): foo.h
关于makefile - 添加对隐式规则的所有使用的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46945154/