? ? Makefile里有許許多多的符號,對于新手而言如果沒有經常使用,就很容易忘記,所以我把常見符號的意義寫下,方便日后忘記查詢。本文章會持續更新...
?
1.$@:代表目標;$^代表所有依賴,$^代表第一個依賴。
? ? ? ? ?eg:下圖的$@代表目標名test,$^代表所有依賴,即test.c和seqlist.c,所以相當于gcc -O0 -g -Wall -o test test.c seqlist.c。
CC = gcc?? ??? ??? ??? ??? ??? ??? ?#使用gcc編譯器
CFLAGS =-O0 -g -Wall?? ??? ??? ??? ?#-O0代表編譯的時候不進行相應的優化;#-g代表可以使用gdb進行相應的調試,編譯的時候會添加一些調試信息#-Wall把警告信息全都打印出來
test:test.c seqlist.c$(CC) $(CFLAGS) -o $@ $^
2..PHONY:假設我們的makefile所在目錄下,剛好有名為clean的文件,那么我們執行make clean這條規則時并不能執行rm *.o test,如果加上.PHONY:,則可以成功執行rm *.o test.(因為每條規則下的命令被執行必需滿足以下情況之一:1.目標在當前路徑不存在;2.某個依賴比目標“新”,假如我們當前路徑有clean文件,而Makefile里面的clean又沒有依賴文件,所以就會發生錯誤啦!)
test: a.o b.o c.ogcc -o test $^%.o : %.cgcc -c -o $@ $<clean:rm *.o test.PHONY: clean
3.
:= ? # 即時變量,A := xxx ? # A的值即刻確定,在定義時即確定
= ? ?# 延時變量,B = xxx ? ?# B的值使用到時才確定
?= ? # 延時變量, 如果是第1次定義才起效, 如果在前面該變量已定義則忽略這句
+= ? # 附加, 它是即時變量還是延時變量取決于前面的定義
A := $(C) #即時變量,定義時即確定,因為變量C還未賦值,所以A為空
B = $(C) #延時變量,用到時才確定,所以打印B為abc 123
C = abcD = AABBCC
D ?= 123456 #在上一行已經定義了變量的,所以根據?=的特性,D打印出來是AABBCCall:@echo A = $(A)@echo B = $(B)@echo D = $(D)C += 123
?