自動變量 | 說明 |
---|---|
$@ |
規則中的目標集合,使用的時候是一個一個的從集合中取元素的。
a b : a.c b.c
echo ($@).o
結果: a.o b.o
|
$% |
若是目標是歸檔成員,則該變量表示目標的歸檔成員
|
$< | 依賴目標中的第一個目標 |
$? | 全部比目標新的依賴目標的集合。以空格分隔。 |
$^ |
全部的依賴目標的集合。以空格分隔。若是在依賴目標中有多個重複的,那個這個變量會去除重複的依賴目標,只保留一份。
|
$+ |
這個變量很像"$^",也是全部依賴目標的集合。只是它不去除重複的依賴目標
|
$* | 這個變量表示目標模式中"%"及其以前的部分。若是目標是"dir/a.foo.b",而且目標的模式是"a.%.b",那麼,"$*"的值就是"dir/a.foo"。 |
$(@D) | 表示"$@"的目錄部分(不以斜槓做爲結尾),若是"$@"值是"dir/foo.o",那麼"$(@D)"就是"dir",而若是"$@"中沒有包含斜 槓的話,其值就是"./"(當前目錄) |
$(@F) | 表示"$@"的文件部分,若是"$@"值是"dir/foo.o",那麼"$(@F)"就是"foo.o","$(@F)"至關於函數"$(notdir $@)"。 |
$(*D) $(*F) |
和上面所述的同理,也是取文件的目錄部分和文件部分。對於上面的那個例子,"$(*D)"返回"dir",而"$(*F)"返回"foo" |
$(%D) $(%F) |
|
$(<D) $(<F) |
分別取第一個依賴文件的目錄部分或文件部分 |
$(^D) $(^F) |
分別表示全部依賴文件的目錄部分和文件部分。(無相同的) |
$(+D) $(+F) |
分別表示全部依賴文件的目錄部分和文件部分。(能夠有相同的) |
$(?D) $(?F) |
分別表示被更新的依賴文件的目錄部分和文件部分。 |
#服務器與客戶端的Makefile的編寫: CC:= gcc CFLAGS:= -Wall -O2 -c OBJ:= server client #CC 是Makefile中常見的預約義變量名稱,默認值爲cc #CFLAGS C編譯器的選項,無默認值 all:$(OBJ) #all:通常表明編譯全部相關項目 server:server.o linklist.o test.o $(CC) -o $@ $^ client:client.o $(CC) -o $@ $^ #$@ 目標文件的完整名稱,$^全部不重複的依賴文件,以空格分開 server.o:server.c linklist.h head.h $(CC) -o $@ $< $(CFLAGS) linklist.o:linklist.c linklist.h head.h $(CC) -o $@ $< $(CFLAGS) test.o:test.c test.h $(CC) -o $@ $< $(CFLAGS) client.o:client.c $(CC) -o $@ $< $(CFLAGS) #$< 第一個依賴文件的名稱 .PHONY:clean #僞指令,沒有依賴文件,直接執行命令 clean: rm -rf *.o $(OBJ)