【问题标题】:how to fix error 'no rule to make target %.o, needed by all. stop'如何修复错误'没有规则来制作目标%.o,所有人都需要。停止'
【发布时间】:2020-11-27 22:49:32
【问题描述】:

当我输入 make 并回车时,它会说:

no rule to make target %.o, needed by all. stop'. 

这是我的生成文件:

CC=g++
LDFLAGS=""

all: %.o %.h
    $(CC) $< $(LDFLAGS) -o bin

%.o: %.cpp %.h
    $(CC) -c $< 

这些是我的目录的内容:

$ ls
main.cpp makefile

我是 GNU make 的新手,刚刚学会使用自动变量。有人可以帮帮我吗?

【问题讨论】:

    标签: c++ makefile gnu-make


    【解决方案1】:

    % 用于替换模式,这是您在为单个模块定义规则时想要的(就像您所做的那样),但不是您想要的“全部”依赖项列表。 % 将扩展为 单个 值。
    相反,您需要一个实际的通配符(如在 shell 扩展中)来匹配所有 *.o 文件。因此,将您的目标定义更改为

    all: *.o *.h
    

    【讨论】:

      【解决方案2】:

      与您的问题无关,但这是不对的:

      LDFLAGS=""
      

      make 不解析引号,因此您已将变量 LDFLAGS 设置为文字字符串 ""(两个双引号)。当你在你的食谱中使用它时:

      $(CC) $< $(LDFLAGS) -o bin
      

      就像你输入了一样:

      g++ ... "" -o bin
      

      这是一个语法错误(您将一个空参数传递给g++。如果您想要一个空变量,您只需编写:

      LDFLAGS =
      

      现在,你的问题。这不是模式规则:

      all: %.o %.h
      

      模式规则的目标(冒号左侧)中必须有模式。由于这是一个明确的规则,因此先决条件(冒号的右侧)是文字字符串%.o 和%.h。 Make 不知道如何构建一个名为 %.o 的文件,因此它失败了。

      不清楚你希望这条规则做什么,所以我不能说更多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-04
        • 1970-01-01
        • 2014-12-23
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 1970-01-01
        相关资源
        最近更新 更多