Linux

這個 Makefile 是如何在不指定編譯器的情況下製作 C 程序的?

  • March 3, 2020

我正在使用“ Advanced Linux Programming (2001)”一書中的 Makefile $$ code $$. 看到GNU make確實正確編譯了程式碼,甚至沒有在 Makefile 中指定編譯器,我感到很奇怪。這就像沒有任何食譜的烘焙!

這是程式碼的最小版本:

測試.c

int main(){}

生成文件

all:            test

並且真的很管用!這是它執行的命令:

cc     test.c   -o test

我在文件中找不到任何有用的東西。這怎麼可能?


PS 附加說明:連語言都沒有指定;因為test.c可用,GNUmake使用cc. 如果存在test.cpptest.cc(當不存在時test.c),則使用g++(而不是c++)。

Make 使用其內置的規則來做到這一點。這些特別告訴它如何編譯 C 程式碼以及如何連結單對象程序。

您實際上甚至不需要 Makefile:

make test

沒有一個就可以工作。

要查看使這一切成為可能的隱藏規則,請使用-p不帶 Makefile 的選項:

make -p -f /dev/null

-r選項禁用這些內置規則。

正如alephzero所指出的,Make 已經有很長時間的內置規則(如果不是總是這樣的話);Stuart Feldman 在 Unix V7 中的第一個版本在 中定義了它們files.c他在 1979 年的論文中提到了它們。它們也是POSIX 規範的一部分。(這並不意味著 Make 的所有實現都支持它們——舊的用於 DOS 的 Borland Make 不支持,至少到 3.0 版為止。)

引用自:https://unix.stackexchange.com/questions/325233