[英]Makefile overriding default implicit rule
為什么此規則無法覆蓋默認的隱式規則?
當調用make時: make myapp
(假設myapp.c在那里)。 make運行默認命令來構建和鏈接程序,而不是此隱式規則中定義的命令:
#... omitted code
LCUS=$(LIBS)/libcus.a
#... omitted code
% : %.o $(LCUS)
echo !!! Custom build !!!
$(MY_CMD) $< -o $@ $(LCUS)
摘自GNU在線make
手冊 :
您可以通過定義具有相同目標和先決條件但具有不同命令的新模式規則來覆蓋內置隱式規則(或您自己定義的規則)。
所以我認為這是因為先決條件與隱式規則不同。
還可以從make
手冊中獲取:
聯的單個對象文件
n
自動地從由no
通過運行接頭(通常稱為ld
通過C編譯器)。 使用的精確命令是$(CC) $(LDFLAGS) no $(LOADLIBES) $(LDLIBS)
。 對於只有一個源文件的簡單程序,此規則是正確的。 如果有多個目標文件(可能來自各種其他源文件),其中一個名稱與可執行文件的名稱相匹配,它也會做正確的事情。 從而,x: yo zo
當
xc
,yc
和zc
都存在時將執行:cc -c xc -o xo cc -c yc -o yo cc -c zc -o zo cc xo yo zo -ox rm -f xo rm -f yo rm -f zo
所以基本上make
理解為從生成的程序文件潛規則.o
文件,但是當你在你的靜態庫扔它不理解。 一種簡單的測試方法是從依賴項中刪除$(LCUS)
(作為臨時措施),看它是否使用您的規則而不是內置規則。 如果確實如此,那么你知道這是你的問題。 如果只是添加myapp
替換%
是一個問題,因為您希望規則構建多個目標,您可以嘗試以下方法:
$(APPS): % : %.o $(LCUS)
其中$(APPS)
是一個包含您要構建的所有應用程序的變量。 這將允許一個規則構建多個目標。 您也可以完全跳過變量的使用並放置一個以空格分隔的列表。 這是靜態模式規則的示例,可以在此處找到更多信息。 靜態模式和隱式規則之間的區別可以在這里找到。
您的規則與內置隱式規則不同,因此不會取消它。
此外,make始終優先選擇不需要將中間文件構建到其中的規則。 如果你預先創建.a
文件make可能會使用你的規則(但它甚至可能不會)。
如果您取消內置規則並保留規則,我認為它應該正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.