- 先標註一個很好的makefile教程
- 這裏歸納瞭如下符號的含義,請對號入座如下 $@, $^, $<, $?和=, +=, :=, ?=和;\ 和 $, $$和%
- section1:(自動化變量,更多自動化變量可參照)
- $@ 表示目標文件(標的)
$^ 表示所有的依賴文件(標的)
$< 表示第一個依賴文件(標的)
$? 表示比目標還要新的依賴文件列表 - 例子分析:(如有hello.c hi.c main.c 源文件,按照 Makefile 規則寫)
那麼用上面符號進行書寫則爲:main: main.o hello.o hi.o gcc -o main main.o hello.o hi.o main.o: main.c cc -c main.c hello.o: hello.c cc -c hello.c hi.o: hi.c cc -c hi.c clean: rm *.o rm main
main: main.o hello.o hi.o gcc -o $@ $^ main.o: main.c cc -c $< hello.o: hello.c cc -c $< hi.o: hi.c cc -c $< clean: rm *.o rm main
- $@ 表示目標文件(標的)
- section2:
- = 直接對變量賦值
- += 追加賦值
- := 該符號右側是否有變量,如有變量且變量的定義在後邊,則忽略該右側變量,其他情況同=號
- ?= 如果符號左側的變量已經定義過則跳過該句。
- section2的具體例子可參照
- section3:(分號和反斜線)
- 分號是分隔符,反斜線是換行符。像if語句塊或for語句要寫在一行時,必須使用分號進行分隔,在此期間如需進行換行則使用反斜線\進行換行即可。此外,注意if語句後的左中括號[前後都有有空格,雙等號“==”表示相等符號,單等號“=”既可以表示相等也可表示賦值,其區別爲:當比較時,比較符號左右都有空格;賦值時,等號左右沒空格。
- section4:( $和$$)
- 單美元符號$表示引用makefile定義變量的值,雙美元符號$$表示引用shell命令中定義的變量的值。一些使用事項可參照
- section5:%(makefile中通配符,附與系統通配符的區別)
- 區別1:Makefile中的%標記和系統通配符*的區別在於,*是應用在系統中的,%是應用在這個Makefile文件中的。
- 區別2:Makefile的通配符%是在**帶着目的(如“尋找test1.o”)**的時候纔會把他要尋找的目標套用通配符%中。而系統通配符*是我不知道目標的名字,系統該目錄下中所有後綴爲.c的文件都是我要找的。
- 重要例子:
如果你想編譯一個文件夾下的所有.c文件,你可能會這樣寫:
但是如果整個文件只有這兩行的話,就會出現這樣的錯誤:%.o:%.c gcc -o $@ $<
Make: *** target not found. stop.
要知道原因,我們先來看看另一個makefile的運行過程,例如有Makefile如下:
如果沒有指定輸出項目的時候Make會自動找到makefile中第一個目標中沒有通配符的目標進行構造,所以步驟是:test1.o:test1.c gcc -o test1.o test1.c test2.o:test2.c gcc -o test2.o test2.c all:test1.o test2.o
1、構造all,發現需要test1.o和test2.o
2、這個時候他就會在Makefile文件中找到目標能匹配test1.o和test2.o的規則。
3、找到test1.o的規則並且知道test1.c存在,運行下面的命令。
4、同步驟三構造出test2.o
5、現在構造all的源文件已經齊全,構建all
其中最重要的是第2步。
Makefile的通配符是在帶着目的(如“尋找test1.o”)的時候纔會把他要尋找的目標套用通配符%中。
而系統通配符*的意思是:
1、我不知道目標的名字,系統該目錄下中所有後綴爲.c的文件都是我要找的。
2、然後遍歷目錄的文件,看是否匹配。找出所有匹配的項目。
makefile中一些符號的含義
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.