我最初有两个隐含规则(为简洁起见而简化):
%$(EXESUFFIX) : %.c
$(CC) -o $* $<
%$(EXESUFFIX) : %.cpp
$(CXX) -o $* $<
但问题是在OS X和Linux上 $(EXESUFFIX)
是空白的,导致规则匹配错误的东西 . 所以我试图使用static pattern rule如下:
$(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.
2 回答
您链接到的GNU Make手册非常清楚静态规则和隐式规则之间的区别 .
我建议在C和C程序之间拆分可执行文件,并为每个程序定义独立的规则 .
我无法重现您的错误,但这适用于GNUMake 3.81:
具有适合相同目标的两个不同规则对于普通模式规则是合法的,但对于静态模式规则则不合法 .