makefile中一些符號的含義

  • 先標註一個很好的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如下:
    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
    
    如果沒有指定輸出項目的時候Make會自動找到makefile中第一個目標中沒有通配符的目標進行構造,所以步驟是:
    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、然後遍歷目錄的文件,看是否匹配。找出所有匹配的項目。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章