makefile - 添加对隐式规则的所有使用的依赖关系

标签 makefile gnu-make

我有一个 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/

相关文章:

java - 修改后的 list 文件部分不起作用

linux - 如何从 GNU make 文件运行 Linux shell 命令来设置构建目标的先决条件

c - 使用 makefile 链接时出错 : Ubuntu

makefile - 如何在 GNU make 中更改具有多个扩展名的列表中每个文件的扩展名?

c++ - 尝试在 AIX 6.1 上创建构建过程

java - 如何制作一个makefile只用于编译一些java文件?

c - Makefile 快板

makefile - 有什么办法可以使命令回显

c++ - 用于编译 .idls 的 Makefile

c - Makefile 总是重新编译某些部分