You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写Makefile生成Q1-Q6可执行文件遇指定错误求助

解决Makefile报错“Recipe commences before first target. Stop.”的问题

嘿,我太懂你折腾好几个小时写Makefile却卡在这里的烦躁了——这个报错其实是因为你没遵循Makefile最基础的「目标-依赖-命令」规则。你现在直接把编译命令一股脑甩在最前面,Makefile根本不知道这些命令对应哪个目标,自然就抛出这个错误了。

咱们直接来改好你的Makefile,顺便给你优化一下,不用重复写那么多冗余命令:

# 定义编译参数和工具变量
BUILD_FLAGS = -W -Wall -pedantic
CC = g++
RM = rm -f  # 加-f参数避免删除不存在文件时弹出报错
EXES = Question1.exe Question2.exe Question3.exe Question4.exe Question5.exe Question6.exe
OBJECTS = Question1.o Question2.o Question3.o Question4.o Question5.o Question6.o

# 默认目标:执行make时自动编译所有可执行文件
all: $(EXES)

# 模式规则:所有.exe文件依赖对应的.o文件,统一生成可执行文件
%.exe: %.o
	$(CC) -o $@ $<

# 模式规则:所有.o文件依赖对应的.cpp文件,统一编译生成目标文件
%.o: %.cpp
	$(CC) $(BUILD_FLAGS) -c $<

# 清理目标:删除生成的可执行文件和目标文件
clean:
	$(RM) $(EXES) $(OBJECTS)

给你拆解下关键改动:

  • 新增了默认目标all,它依赖你要生成的6个可执行文件,这样你只需要敲make就能自动编译所有目标,不用一个个单独指定
  • 用**模式规则%.exe: %.o和%.o: %.cpp**替代了重复6次的编译/链接命令,既简洁又方便后续维护——要是以后加Q7,直接在EXES和OBJECTS里追加就行,不用改编译逻辑
  • 修正了clean目标的命令:原来的$(RM)$(EXES)$(OBJECTS)会把命令连在一起变成rm*.exe*.o,这肯定会报错,现在加了空格,变成正确的清理命令
  • 给RM加了-f参数,避免删除不存在的文件时弹出不必要的错误提示

现在你执行make就能生成所有6个可执行文件,执行make clean就能清理掉生成的.o和.exe文件啦。

内容的提问来源于stack exchange,提问作者Bryce Purnell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:38:08