Makefile中常用自動變量

自動變量 含義
$* 不包含擴展名的目標文件名稱
$+ 所有的依賴文件,以空格分開,並以出現的先後爲序,可能包含重複的依賴文件
$< 第一個依賴文件的名稱
$? 所有時間戳比目標文件晚的依賴文件,並以空格分開
$@ 目標文件的完整名稱
$^ 所有不重複的依賴文件,以空格分開
$% 如果目標是歸檔成員,則該變量表示目標的歸檔成員名稱


實例:
OBJS = kang.o yul.o
CC = gcc
CFLAGS =-Wall -O -g
david : $ (OBJS)
$(CC) $^ -o $@
kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c $< -o $@
yul.o : yul.c yul.h

$(CC) $(CFLAGS) -c $< -o $@                    


 eg:
objects = foo.o bar.o
all: $(objects)
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
“%.o”表明要所有以“.o”結尾的目標,也就是“foo.o bar.o”,“%.c”則取模式“%.o”的“%”,也就是“foo bar”,併爲其加下“.c”的後綴,所以依賴目標就是“foo.c bar.c”。
命令中的“$<”和“$@”則是自動化變量,“$<”表示所有的
依賴目標集(也就是“foo.c bar.c”),“$@”表示目標集(也就是“foo.o bar.o”)。
等價於下面的規則:
foo.o : foo.c
$(CC) -c $(CFLAGS) foo.c -o foo.o
bar.o : bar.c
@$(CC) -c $(CFLAGS) bar.c -o bar.o
前面加上@,表示取消回顯,就是說不顯示編譯過程。
試想,如果我們的“%.o”有幾百個,那種我們只要用這種很簡單的“靜態模式規則”                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章