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