Make
百分比與星號(星號)makefile 先決條件有什麼區別
我試圖理解為什麼某些 Makefile 具有先決條件
%.txt
而其他具有*.txt
.我已經創建了這個文件夾佈局。
$ tree . . ├── hi1.txt ├── hi2.txt ├── hi3.txt └── Makefile
首先,我試過這個。
foo.txt: *.txt echo $^
它符合我的預期。
$ make echo hi1.txt hi2.txt hi3.txt hi1.txt hi2.txt hi3.txt
但是,後來我看到一些 Makefile 使用
%.txt
的是萬用字元。所以我接下來嘗試了。foo.txt: %.txt echo $^
但是,這會導致錯誤。
$ make make: *** No rule to make target '%.txt', needed by 'foo.txt'. Stop.
有人可以解釋為什麼會這樣嗎?
GNU Make 4.3
在
make
中,百分號用於模式匹配,它需要一個目標以及(至少)一個先決條件:%.o: %.c $(CC) $(CFLAGS) -c -o $@ $<
使用這個 makefile,我們指定為了建構文件名以 結尾的東西
.o
,您需要有一個具有相同前綴但以.c
而不是結尾的文件.o
為了能夠建構這些規則,您顯然需要能夠引用目標以及先決條件;這就是
$@
and$<
變數的用武之地。$@
意思是“這條規則的目標”,$<
意思是“這條規則的第一個列出的先決條件”。如果您需要建構一個使用所有先決條件的命令(例如,連結執行檔),那麼您可以使用變數$^
:%: %.o lib.o $(CC) $(LDFLAGS) -o $@ $^
如果您將上述兩個範例 makefile 片段組合到一個 makefile 中,並且您有一個文件“lib.c”,其中包含一些您想在同一目錄中的多個 C 程序中使用的通用程式碼,那麼您可以添加任何隨機
.c
文件,比如說foo.c
,並將其編譯成一個程序,該程序foo
也連結到 中的程式碼lib.c
,而不需要對您的 makefile 進行任何更改。請注意,也可以有具有相同目標的模式,只要先決條件不同;例如,以下將起作用:
%.o: %.c $(CC)..... %.o: %.cpp $(CXX).....
也就是說,只要您在此目錄中沒有任何恰好與 C 源文件具有相同名稱(無副檔名)的 C++ 源文件,它就會按預期工作。如果發生這種情況,C++ 版本將被忽略,而是編譯 C 原始碼(因為 C 規則在 makefile 中首先列出)
有關更多資訊,請參閱 GNU make 手冊中的相關部分。