【问题标题】: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 的文件,因此它失败了。
不清楚你希望这条规则做什么,所以我不能说更多。