Makefile模式背后的逻辑是什么?

Makefile模式背后的逻辑是什么?,file,makefile,pattern-matching,File,Makefile,Pattern Matching,我曾经认为Makefiles中的“%”与bash中的“*”是等价的,因此类似这样的东西是有意义的: %.o: %.c gcc $< -o $@ 有人能解释一下怎么做吗?它的工作原理与shell globbing中的*完全相同,只是%必须至少匹配一个字符,而*可以匹配零个字符 如果您有问题,请务必使用真实的示例,显示您键入的命令和获得的输出,并解释为什么输出不是您想要的,否则我们只能猜测 首先,不要在模式规则的末尾添加冒号;因为这是一个语法错误,所以我假设您的真实makefile

我曾经认为Makefiles中的“%”与bash中的“*”是等价的,因此类似这样的东西是有意义的:

%.o: %.c
    gcc $< -o $@ 

有人能解释一下怎么做吗?

它的工作原理与shell globbing中的
*
完全相同,只是
%
必须至少匹配一个字符,而
*
可以匹配零个字符

如果您有问题,请务必使用真实的示例,显示您键入的命令和获得的输出,并解释为什么输出不是您想要的,否则我们只能猜测

首先,不要在模式规则的末尾添加冒号;因为这是一个语法错误,所以我假设您的真实makefile只有一个冒号:

test%: %.c
        ...
您没有给我们提供实际的示例,因此我们无法确定,但最有可能的问题是您忘记了
%
的值在目标和规则匹配的前提条件中必须相同

因此,如果您有一个带有
test%:%.c
的模式规则,并且您想要构建一个目标
testfoo
,那么该模式匹配
foo
,这意味着您必须拥有一个文件
foo.c

如果源文件是
testfoo.c
,则必须编写
test%:test%.c


您可以使用
make-d
来理解make为什么不使用您的模式规则。

文件:=$(通配符测试*)
我正在执行:
test%:%.c gcc$^-o$@
make test1
一起使用,我得到了“make:**没有规则使目标“test1”。停止”。我做错了什么?您有文件
1.c
?当make将模式规则
test%
与目标
test1
匹配时,模式
%
匹配
1
。然后,当它查看先决条件
%.c
时,它用目标中的值替换
%
,得到
1.c
。如果该文件不存在,则此模式规则不匹配,make将继续寻找其他方法来构建目标
test1
。如果所有的可能性都不匹配,它会说“没有制定目标的规则”。
test%: %.c
        ...