当前位置: 首页 > 知识库问答 >
问题:

如何在Makefile中创建静态隐式规则?

邵骏喆
2023-03-14

我最初有两个隐含的规则(为了清楚起见,简化了):

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

测试.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个答案

金昌胤
2023-03-14

我无法重现您的错误,但这在GNUake 3.81中有效:

%$(EXESUFFIX) : %.c
    $(CC) -o $* $<

%$(EXESUFFIX) : %.cpp
    $(CXX) -o $* $<

使用两个不同的规则来满足相同的目标对于普通模式规则是合法的,但对于静态模式规则则不合法。

封景曜
2023-03-14

你链接的GNU Make手册很清楚静态规则和隐式规则的区别。

4.12.2静态模式规则与隐式规则

静态模式规则与定义为模式规则的隐式规则有许多共同之处

隐式规则可以应用于与其模式匹配的任何目标,但仅当目标没有另行指定的配方时,并且仅当可以找到先决条件时,它才适用。如果有多个隐式规则适用,则只有一个规则适用;选择取决于规则的顺序。

相反,静态模式规则适用于您在规则中指定的目标的精确列表。它不能适用于任何其他目标,它总是适用于指定的每个目标。如果有两个相互冲突的规则,并且都有食谱,那就是错误。

我建议在C和C程序之间拆分您的可执行文件,并为每个程序定义独立的规则。

 类似资料:
  • Makefile有很多灵活的写法,可以写得更简洁,同时减少出错的可能。本节我们来看看这样一个例子还有哪些改进的余地。 一个目标依赖的所有条件不一定非得写在一条规则中,也可以拆开写,例如: main.o: main.h stack.h maze.h main.o: main.c gcc-c main.c 就相当于: main.o: main.c main.h stack

  • 问题内容: 例如,在Java中,我可能有一个类,并且有一个名为的静态方法,因此我可以执行以下操作: 我该如何在目标C中做类似的事情? 非常感谢 问题答案: 在Objective-C中,您将此称为“类方法”,请参见此处: 该 + 是最重要的事情; 您可以这样调用方法:

  • 我希望函数位于类中(不污染全局名称空间),但可以静态访问(从不创建它们所在的对象)。提议的解决办法: 这是一个好的解决方案,还是不可避免地会创建一个对象?我应该使用哪种图案?

  • Netbeans阻止我创建静态类。我怎么做一个? 我将类创建为:右键单击project>new>Java类。然后我只是在创建的类上添加一个static关键字。

  • 问题内容: 谁能解释Java如何执行此代码?我的意思是执行每个语句的顺序。 输出: 问题答案: 类初始化开始。最初为null,为false 第一个静态变量初始值设定项()运行: 创建了一个新实例 用于执行的实例变量初始值设定项-当前为false,因此值为false 执行第二个静态变量初始化器(),将值设置为true 类初始化完成 运行,打印出,这是错误的 请注意,如果声明为,则将其视为 编译时常量

  • 我正在学习使用Gate从文档中检索信息。谁能给我解释一下我要做什么才能让我的语法规则发挥作用。我已经检查了大多数教程和大门手册,但我仍然没有得到重点。我想提取人,地点和日期作为我命名的实体。 所以我所做的是:1。在文档中确定了我的日期模式2。为每个模式3创建JAPE语法规则。加载。jape文件作为一种新的jape传感器 我的约会模式如下:1。DateMonthYear 2。每月 因此,如果我理解正