[英]How do I create a static implicit rule in a Makefile?
我最初有兩個隱式規則(為清楚起見而簡化):
%$(EXESUFFIX) : %.c $(CC) -o $* $< %$(EXESUFFIX) : %.cpp $(CXX) -o $* $<
但是問題是在OS X和Linux上$(EXESUFFIX)
是空白的,這導致規則匹配錯誤的內容。 因此,我嘗試使用靜態模式規則 ,如下所示:
$(EXECS) : %$(EXESUFFIX) : %.c $(CC) -o $* $< $(EXECS) : %$(EXESUFFIX) : %.cpp $(CXX) -o $* $<
$(EXECS)
是目標,因此沒有擴展名。 但是現在,對以.cpp結尾的源代碼運行最高規則。 我該如何解決?
舉一個完整的例子:
Makefile文件:
EXESUFFIX = EXECS = test $(EXECS) : %$(EXESUFFIX) : %.c $(CC) -o $* $< $(EXECS) : %$(EXESUFFIX) : %.cpp $(CXX) -o $* $<
TEST.CPP:
#include <stdio.h> int main(int argc, char *argv[]){ printf("Hello World\n"); return 0; }
打印出錯誤:
Makefile:8: warning: overriding commands for target `test' Makefile:5: warning: ignoring old commands for target `test' make: *** No rule to make target `test.c', needed by `test'. Stop.
您鏈接到的GNU Make手冊非常清楚靜態規則和隱式規則之間的區別。
4.12.2靜態模式規則與隱式規則
靜態模式規則與定義為模式規則>的隱式規則有很多共同點(請參閱定義和重新定義模式規則)。 兩者都有目標的模式和構造先決條件名稱的模式。 區別在於make如何確定何時應用規則。
隱式規則可以應用於與其模式匹配的任何目標,但是僅當目標沒有另外指定配方時,並且僅在可以找到前提條件時,它才適用。 如果出現多個不適用的隱含規則,則僅適用一個。 選擇取決於規則的順序。
相反,靜態模式規則適用於您在規則中指定的精確目標列表。 它不能應用於任何其他目標,並且總是適用於指定的每個目標。 如果兩個沖突的規則適用,並且都有配方,那就是錯誤的。
我建議在C和C ++程序之間拆分可執行文件,並為每個程序定義獨立的規則。
我無法重現您的錯誤,但這在GNUMake 3.81中有效:
%$(EXESUFFIX) : %.c
$(CC) -o $* $<
%$(EXESUFFIX) : %.cpp
$(CXX) -o $* $<
具有兩個適合同一目標的不同規則對於普通模式規則是合法的,但對於靜態模式規則則不合法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.