Linux
這個 Makefile 是如何在不指定編譯器的情況下製作 C 程序的?
我正在使用“ 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.cpp
或test.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 版為止。)