Make

百分比與星號(星號)makefile 先決條件有什麼區別

  • April 11, 2020

我試圖理解為什麼某些 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 手冊中的相關部分

引用自:https://unix.stackexchange.com/questions/579332