有沒有辦法使用自動變量來獲取目標名稱。Makefile中的過濾函數
SOURCES = $(wildcard *.c)
dummytgt: $(OBJ)/tier.o
$(GCC) $(CFLAGS) -c $(filter [email protected],$(SOURCES)).c -o [email protected]
我不想提及的文件名作爲輸入,但將要使用的過濾功能,以獲得.c文件是相同的目標名稱。使引發錯誤沒有輸入文件
有沒有辦法使用自動變量來獲取目標名稱。Makefile中的過濾函數
SOURCES = $(wildcard *.c)
dummytgt: $(OBJ)/tier.o
$(GCC) $(CFLAGS) -c $(filter [email protected],$(SOURCES)).c -o [email protected]
我不想提及的文件名作爲輸入,但將要使用的過濾功能,以獲得.c文件是相同的目標名稱。使引發錯誤沒有輸入文件
這是有幫助的看看如何使解析這個:
SOURCES = $(wildcard *.c)
dummytgt: $(OBJ)/tier.o
$(GCC) $(CFLAGS) -c $(filter [email protected],$(SOURCES)).c -o [email protected]
首先, 它會讀取makefile文件,定義和擴展宏,因爲它去。
SOURCES = $(wildcard *.c)
意味着${SOURCES}
是與定義一個$(wildcard *.c)
懶惰變量。 懶惰?是的,這些遞歸變量(因爲使手冊有它)只有當他們自己擴大時擴大其右手邊。$(OBJ)
被展開。 讓我們假設${OBJ}
的擴展是objs
(說)。dmmytgt
。你可以寫這完全一樣的效果:
dummytgt: objs/tier.o
$(GCC) $(CFLAGS) -c $(filter [email protected],$(wildcard *.c)).c -o [email protected]
對該片段工作, 文件objs/tier.o
必須已經存在。 讓我們假設它。
製作目前擁有它需要建立dummytgt
(根據你的makefile), 所以現在它擴展命令塊。
$(wildcard *.c)
擴大爲1.c 2.c
(說)。[email protected]
是dummytgt
$(filter dummytgt,1.c 2.c)
當然是空的(並且總是會是!)${GCC}
是gcc
(說)${CFLAGS}
是空的(說)因此,外殼變得
gcc -c .c -o dummytgt
想必GCC抱怨說沒有叫.c
文件。 由此產生的錯誤停止使的執行。
有些東西不喜歡在這裏: $(wildcard)
僅適用於hacky單線程makefiles恕我直言。 dummytgt
需要objs/tier.o
,但其構建說明從未引用它。 你的$(filter)
總是膨脹到無。