我最初有两个隐式规则(为清楚起见而简化):
%$(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结尾的源代码运行最高规则。我该如何解决?
举一个完整的例子:
生成文件:
EXESUFFIX =
EXECS =测试
$(EXECS):%$(EXESUFFIX):%.c
$(CC)-o $ * $ <
$(EXECS):%$(EXESUFFIX):%.cpp
$(CXX)-o $ * $ <
test.cpp:
#include
int main(int argc,char * argv []){
printf(“Hello World \ n”);
返回0;
}
打印出错误:
Makefile:8:警告:覆盖目标“测试”的命令
Makefile:5:警告:忽略目标“测试”的旧命令
make:***没有规则来创建目标test.c。停止。
最佳答案
您链接到的GNU Make手册非常清楚静态规则和隐式规则之间的区别。
我建议在C和C++程序之间拆分可执行文件,并为每个程序定义独立的规则。
关于c++ - 如何在Makefile中创建静态隐式规则?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25129796/