通配符* 用于简单地生成当前目录中匹配文件的列表。模式替换字符% 是当前可能存在或不存在的文件的占位符。
要扩展您已经发现的手册中的 Wildcard pitfall 示例,
objects = *.o
如果没有 '.o' 文件,正确的表述方式类似于
objects := $(patsubst %.c,%.o,$(wildcard *.c))
make 本身在这种情况下不执行通配符扩展,但是当然,如果您将文字值 *.o 传递给 shell,那就是扩展发生的时候(如果有匹配项),所以这可能有点难以调试。 make 将在规则的目标中进行通配符扩展,所以你可以说
foo: *.o
并让它完全按照您的预期工作(前提是在评估此依赖项时保证所需的文件存在)。
相比之下,您可以有一个带有模式占位符的规则,当make 试图找到可用于生成所需依赖项的配方时,该规则会填充任何匹配的名称。有一些内置的规则,比如
%.o: %.c
$(CC) $(CCFLAGS) $^ -o $@
(这里近似真实的东西)说“给定一个匹配%.c的文件,对应的文件%.o可以生成如下。”在这里,% 是一个占位符,可以替换为任何内容;因此,如果将其应用于现有文件 foo.c,它会说明如何生成 foo.o。
你可以改写成*匹配每个匹配文件,而%匹配任何匹配文件。