LOCAL_HEADERS = $(shell find . -name "*.inc.h")
LOCAL_GCHS = $(LOCAL_HEADERS:.h=.h.gch)
CPCH = -include-pch $(LOCAL_GCHS)
%.o: %.c $(LOCAL_GCHS)
$(CC) -c $(CFLAGS) $(CPCH) $(DEBUG) $< -o $@;
我想确保
.o
文件依赖于 .c
文件和 $(LOCAL_GCHS)
。 在单进程模式下工作,但是在-j30
模式下,编译器报错:
错误:无法读取PCH文件./headers/world.inc.h.gch:'没有这样的文件或目录'
终于创建了
world.inc.h.gch
文件,但是创建.o
文件时,world.inc.h.gch
似乎并不存在。
为什么不能在创建
%.o: %.c $(LOCAL_GCHS)
文件之前重新创建 $(LOCAL_GCHS)
语句?以下是静态模式规则的语法:
.o
目标列表指定规则适用的目标。目标可以包含通配符,就像普通规则的目标一样(请参阅在文件名中使用通配符target-pattern和 prereq-patterns 说明如何计算每个目标的先决条件。每个目标都与 target-pattern 进行匹配,以提取目标名称的一部分(称为词干)。该词干被替换到每个 prereq-patterns 中以生成先决条件名称(每个 prereq-pattern 中的一个)。 每个模式通常仅包含一次字符“%”。当
target-pattern匹配目标时,‘%’可以匹配目标名称的任何部分;这部分称为茎。模式的其余部分必须完全匹配。例如,目标
targets …: target-pattern: prereq-patterns … recipe …
匹配模式‘%.o’,以‘foo’作为词干。目标和foo.o
与该模式不匹配。每个目标的先决条件名称是通过用每个先决条件模式中的“%”替换词干来创建的。例如,如果一个先决条件模式是foo.c
foo.out
,则替换词干“foo”会给出先决条件名称
。编写不包含“%”的先决条件模式是合法的;那么这个先决条件对于所有目标都是相同的。 从表面上看,这意味着您的规则缺少第二个冒号,应该写成:%.c
foo.c