我正在学习makefile并且遇到了模式匹配规则如下:
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $
我怀疑是上面的规则(据我所知)将源文件转换为目标文件,但在上面的规则中使用自动变量$<
,它应该始终将第一个源文件转换为目标文件,对?
因此,假设我有三个源文件名f1.c,f2.c,f3.c,由于使用了自动变量$<
,上述规则应该根据我的假设将f1.c转换为f1.o.纠正我如果我错了。
答案 0 :(得分:2)
你只是部分错误。
%.o : %.c
是一种模式规则,在这种情况下,仅针对具有公共前缀的.o
和.c
文件的对执行规则。
为了解释这一点,我们假设make已经开始考虑以.o
结尾的目标。查看其存储的规则,它发现这与上述模式规则中的目标完全匹配 - 然后通过获取与%
匹配的字符串部分(称为目标的 stem )继续进行并将其逐字插入到(右)先决条件一侧出现的所有%
中。在我们的例子中,这给出了一个foo.o : foo.c
但从不foo.o : foo.c foo1.c bar1.c
,因为右侧实际上只包含您在模式中提供的一个名称,即%.c
。
当然你可以有例如%.o : %.h %.c
然后$<
确实会引用匹配的.h
文件,该文件会使上面的配方无法用于编译。在处理make时更深入地阅读https://www.gnu.org/software/make/manual/make.html是非常必要的,因为还有很多事情要考虑,而不是我在SO答案中提到的。
修改强>
很抱歉,我错过了你的一部分问题:关于模式规则,或者更确切地说,make中的所有规则,它始终是最终目标的问题,即首先遇到的问题(或者在命令行中给出的问题) )。如果此目标取决于您的文件f1.o f2.o f3.o
,则将生成所有这些中间目标,因为模式规则与每个目标匹配。换句话说:make为在遍历最终目标的依赖关系树的遍历期间找到的每个目标实例化模式规则 - 它是不一个接收所有匹配目标的规则立刻,但正如名称所示,是一种如何为一个具体目标创建实际规则的模式。