Makefile 通配符前提条件给出了奇怪的错误消息

Makefile 通配符前提条件给出了奇怪的错误消息,makefile,Makefile,在本例中: 生成文件: eat_pie: pie rm pie eat_%: % rm $* 终端: $ make eat_pie make: *** No rule to make target `pie', needed by `eat_pie'. Stop. $ make eat_cake make: *** No rule to make target `eat_cake'. Stop. 为什么不使eat_蛋糕输出目标蛋糕丢失 GNU手册规定: 通配符扩展由目

在本例中:

生成文件:

eat_pie: pie
    rm pie

eat_%: %
    rm $*
终端:

$ make eat_pie
make: *** No rule to make target `pie', needed by `eat_pie'.  Stop.

$ make eat_cake
make: *** No rule to make target `eat_cake'.  Stop.
为什么不使eat_蛋糕输出目标蛋糕丢失

GNU手册规定:

通配符扩展由目标和中的make自动执行 先决条件


很不清楚你在问什么。通配符替换在给定的示例中起作用(除非目标声明为虚假-通配符不会扩展为虚假)。您的问题是您的“吃”规则取决于文件的存在。您没有“pie”或“cake”文件,并且make不知道如何构建它们(因为没有这样做的规则),这就是错误消息所说的。

我希望通配符目标中有一个更具体的错误,即没有生成目标cake的规则。但是make告诉我它甚至没有吃蛋糕的规则。这很奇怪,因为eat_%显然与eat_蛋糕相匹配。没什么奇怪的。这就是为什么通配符不适用于冒牌货的确切原因——没有可与之匹配的文件。如果您要创建文件“cake”,它将匹配。这就是通配符的工作原理——与现有文件进行匹配。