这个 Makefile 是如何在不指定编译器的情况下生成 C 程序的?

这个 Makefile 是如何在不指定编译器的情况下生成 C 程序的?

我正在使用书中的 Makefile“高级Linux编程(2001)”[代码]。我看到这一点很奇怪GNU 使确实可以正确编译代码,甚至无需在 Makefile 中指定编译器。这就像没有任何食谱的烘焙!

这是代码的最小版本:

测试.c

int main(){}

生成文件

all:            test

并真正发挥作用!这是它执行的命令:

cc     test.c   -o test

我在文档中找不到任何有用的东西。这怎么可能?


PS 补充一点:连语言都没有指定;因为test.c可用,GNUmake使用cc.如果存在test.cpptest.cc(当不存在时test.c),则使用g++(而不是c++)。

答案1

Make 使用它的内置规则。它们特别告诉它如何编译 C 代码以及如何链接单对象程序。

实际上你甚至不需要 Makefile:

make test

没有一个就可以工作。

要查看使这一切成为可能的隐藏规则,请使用-p不带 Makefile 的选项:

make -p -f /dev/null

-r选项禁用这些内置规则。

正如所指出的阿莱夫泽罗, Make 已经有很长一段时间的内置规则了(如果不是总是如此的话); Stuart Feldman 在 Unix V7 中的第一个版本将它们定义在files.c, 和他 1979 年的论文提到他们。他们也是POSIX规范。 (这并不意味着 Make 的所有实现都支持它们 — 旧的 Borland Make for DOS 不支持,至少 3.0 版之前不支持。)

相关内容