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

what is the logic behind Makefile patterns?

我曾经认为 Makefiles 中的 '%' 等同于 bash 中的 '*',因此这样的事情是有道理的:

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

但是,当尝试检索以某内容开头的文件时它不起作用,这在 bash 中可以像 ls test* 那样完成,例如:

#retrieve all files starting with test
test%: %.c
    gcc $< -o $@

谁能解释一下这是如何做到的?

它的工作方式与 shell globbing 中的 * 完全一样,只是 % 必须至少匹配一个字符,而 * 可以匹配零个字符。

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

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

test%: %.c
        ...

你没有给我们一个实际的例子所以我们不能肯定地说,但很可能你遇到的问题是忘记了 % 的值在目标和先决条件中必须相同使规则匹配。

所以如果你有一个带 test% : %.c 的模式规则并且你想构建一个目标 testfoo,模式匹配 foo,这意味着你必须有一个文件 foo.c.

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

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