执行make fclean报missing separator、无rm目标规则错误排查
问题根因
两个报错均为Makefile语法书写不规范导致,和双引号没有任何关系:
Makefile:27: *** missing separator报错:Makefile强制要求每个规则下的执行命令必须以Tab字符作为行首缩进,不能用连续空格替代。你当前clean、fclean规则下的命令行前是多个空格,不符合语法要求。make: *** No rule to make target 'rm', needed by 'clean'报错:你错误添加双引号+反斜杠续行后,make会把后续的rm识别为目标的依赖项,而非要执行的命令,找不到对应rm目标的构建规则自然报错。另外你原始的fclean目标写法本身就有语法错误:反斜杠是用来续接目标的依赖列表的,不能直接把执行命令接在目标行的续行后面。
修复方案
按以下规则调整Makefile即可:
- 所有规则下的执行命令行,行首统一用单个Tab字符缩进,禁止用空格代替Tab
- 修正
fclean目标的结构:fclean的依赖仅为clean,删除生成二进制文件的命令要单独放在fclean目标的下一行,用Tab开头 - 建议取消
.PHONY行的注释,避免目录下存在和all/clean/fclean/re同名的文件时,make误判目标已构建不执行对应规则
修正后的完整Makefile内容如下:
## ## **** PROJECT, 2022 ## Makefile ## File description: ## Makefile that build the project ## SRC = ./main.c \ ./calc.c OBJ = $(SRC:.c=.o) NAME = fakeProj CFLAGS = -ftest-coverage -O2 BCK_DIR = backup CC = clang all: $(NAME) $(NAME): $(OBJ) $(CC) -o $(NAME) $(OBJ) clean: rm -f $(OBJ) fclean: clean rm -f $(NAME) re: fclean all .PHONY: all clean fclean re
注意:上述代码里命令行开头的空白是Tab字符,复制后如果你的编辑器自动把Tab转成空格,需要手动改回Tab,否则还是会报分隔符错误。
内容的提问来源于stack exchange,提问作者Cogal
相关产品推荐
相关产品推荐

