簡體   English   中英

如何在Makefile中創建靜態隱式規則?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM