繁体   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