我正在使用GNU make。在我得到的Makefile中,我看到符號'%'。例如在 %.c,%.asm,%.o等等的背景下(是否會返回該擴展名的所有文件的通配符)GNU Make中`%`字符的作用是什麼?
%是什麼意思?
什麼將下面的規則來實現:
%.o: %.c
gcc $< -o:[email protected]
謝謝你,
〜AD
我正在使用GNU make。在我得到的Makefile中,我看到符號'%'。例如在 %.c,%.asm,%.o等等的背景下(是否會返回該擴展名的所有文件的通配符)GNU Make中`%`字符的作用是什麼?
%是什麼意思?
什麼將下面的規則來實現:
%.o: %.c
gcc $< -o:[email protected]
謝謝你,
〜AD
規則:
%.o: %.c
gcc $< -o:[email protected]
將爲每個C文件建立一個目標文件使用它下面的命令。所以是的,%就像一個通配符,但我傾向於認爲它是「對於每一個」,因爲這是規則的結果。 $<
表示依賴文件,[email protected]
表示要構建的對象。如果你這樣做:
fred.o: fred.c
gcc $< -o:[email protected]
這裏[email protected]=fred.o
和$<=fred.c
同樣
fred.o: fred.c george.c
gcc $< -o:[email protected]
給[email protected]=fred.o
和$<=fred.c george.c
。
編輯:從我將擴大這個命令。
%
將匹配與它相匹配的所有內容。所以%.c
表示當前目錄中的所有.c文件。 asm/%.asm
表示擴展名爲.asm
的subdir asm中的所有文件。它就像一個令牌一樣,所以無論什麼時候你會在下一次使用%
時使用它,即在標籤中。
因此,該規則:
objs/asm/%.o: arch/%.S
nasm -felf64 $< -o [email protected]
鑑於arch/hello.S
,arch/bye.S
,arch/somethingelse.S
將創建obj/asm/hello.o
,obj/asm/bye.S
,obj/asm/somethingelse.o
。
我在http://www.gnu.org/software/automake/manual/make/Pattern-Rules.html上閱讀關於模式規則的內容。在那裏,我讀了一條聲明:「模式規則看起來像一條普通的規則,除了它的目標包含字符'%'(恰好其中之一)「。它們中的一個是什麼意思?另外我有一個模式規則,如:%.obj:isp /%.asm $(ASM)$ <-o:$ @但不知怎麼的,它並沒有選擇所有彙編的彙編文件。我稍後將一個程序集文件添加到該文件夾,並且沒有組裝。必須手動添加該文件的構建規則。 – goldenmean 2010-12-15 15:50:10
這意味着無論%代表什麼都會被使用%提到。你無法一次匹配兩件事。該規則將匹配isp/somename.asm中的所有內容並創建somename.o。試試ls isp/*。asm。這就是isp /%。asm會匹配的。然後它會佔用%,並在末尾放置一個.o,這就成爲了規則的名稱(要做的事情)。 – 2010-12-15 15:55:23
好吧,所以如果%.asm表示每個asm文件,則將其中的每一個轉換爲* .obj。所以當我添加一個更多的asm文件到文件夾中的現有文件,但它沒有得到組裝?可能是什麼原因。對不起,我有點困惑? – goldenmean 2010-12-15 16:01:55
這個問題是「通配符的目的是什麼?」還有一個問題的措辭是「我怎樣才能達到目的」,回答「通配符!」我會把它稱爲反向重複:-)這是問題:http://stackoverflow.com/questions/1633527/wildcard-targets-in-a-makefile – 2010-12-15 15:41:46
我在閱讀有關模式規則:gnu.org/軟件/ automake/manual/make/Pattern-Rules.html在那裏我讀了一條聲明:「模式規則看起來像一個普通的規則,只不過它的目標包含字符'%'(恰好就是其中之一)。」他們中的哪一個意味着什麼? – goldenmean 2010-12-15 15:50:45