如果您make test在以下 Makefile 上運行(使用其他空目錄):
test.%:
@echo $*
test: test.dummyextension
你得到以下輸出:
dummyextension
o
cc test.o test.dummyextension -o test
clang: error: no such file or directory: 'test.o'
clang: error: no such file or directory: 'test.dummyextension'
clang: error: no input files
make: *** [test] Error 1
為什么?
我懷疑它與隱式規則有關,但我make -p在我的機器上進行了搜索,但找不到任何與%: %. 我希望輸出只是dummyextension,但它幾乎就像test.o我的目錄中有一個幻影檔案(盡管我檢查了十次沒有)。
如果您;在test.dummyextension先決條件之后放置一個,或者向test規則添加任何內容,則一切都會按預期進行。這是我能想到的最少失敗的例子,我不知道你為什么會看到這種行為。有任何想法嗎?
uj5u.com熱心網友回復:
Make 可以鏈接多個規則來創建一個目標。在這種情況下,它具有以下內置規則:
%: %.o
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
這告訴 maketest如果它可以找到制作中間檔案的方法,它就可以制作test.o。所以現在它尋找一種方法來制作test.o并且它看到你的模式規則test.%:,它與詞干匹配o。所以它找到了方法!
您還告訴 maketest需要test.dummyextension,所以它會尋找一種方法來實作它,并且模式再次test.%:匹配,這次是使用 stem dummyextension。
所以 make 首先運行該test.%配方兩次以制作兩個先決條件。然后它運行%: %.o配方以制作最終目標。本$^食譜中的所有先決條件,所以無論test.o從內置格式規則,以及獲得test.dummyextension,通過在Makefile中顯式依賴獲得,出現在命令。
您可以通過使用-r標志禁用內置規則來測驗這一點,然后手動將上述模式規則添加到您的 Makefile 中。
這里要理解的關鍵點是:
一行表格:
test: test.dummyextension
僅向目標添加依賴項。這是不是使目標的規則。這可能來自其他地方。Make 沒有看到這一點,并決定test使用空白配方創建。
一個節的形式:
test: test.dummyextension
;
這是制定目標的規則。作為顯式規則,它比可能也匹配的模式規則具有更高的優先級。這確實告訴 make 它已經找到了test使用配方制定的規則,;并且它停止尋找另一個規則。
如果沒有找到明確的目標,Make 將搜索隱含規則以生成任何目標。如果你不希望它這樣做,你可以給它一個明確的規則,就像上面一樣,或者用.PHONY: target. 不搜索隱式規則以查找虛假目標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/373331.html
上一篇:計算沒有執行位的子目錄數
