我最初有两个隐式规则(为清楚起见而简化):

%$(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/

10-09 13:22