寫Makefile時最容易忘記的就是以下這些自動變數:
$@ 代表Target
$? 代表該規則的所有dependencies
$< 代表該規則的第1個dependency
$^ 代表整個Makefile中的所有dependencies(感覺不常用)
還有pattern variable,例如:
%.o %.c ...
用法大概如下
default: a.o b.o c.o
g++ -o outputFile $? # $? 就是 a.o b.o c.o
%.o: %.cpp %.h
g++ -c $< [-o $@] # $< 就是 %.cpp,$@是%.o(可寫可不寫,因為default 生成的檔案就會根據%.cpp來命名)
意思就是說
當用g++編譯產生outputFile時
會先去檢查a.o b.o和c.o存不存在或是有沒有被動過
對於每個.o檔
makefile會自動去找到%.o: %.cpp %.h這條rule
所以剛剛檢查的動作
就會變成分別檢查 a.cpp a.h、b.cpp b.h和c.cpp c.h
如果相對應的檔案有被更動過的話
則.o檔則會被重新編譯
等到a.o b.o c.o都被檢查過(或被重新編譯過後)
就輪到 g++ -o outputFile $? 了
沒有留言:
張貼留言