编写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
相关产品推荐
相关产品推荐

