执行touch test.cpp后Makefile规则异常,覆盖文件求原因解析
问题原因分析
你的Makefile出现异常的核心问题出在%.o规则的写法上:
%.o: ${SRCS} ${CC} ${CFLAGS} -c $< -o $@
这个规则的逻辑是所有.o文件都依赖test.cpp,并且通过编译test.cpp生成任意.o文件,完全违背了“一个.cpp对应一个.o”的常规编译逻辑。
结合Make的隐式规则和WSL2的文件系统特性,触发异常的流程是:
- 执行
touch test.cpp后,WSL2可能存在的时间同步问题,导致Make错误判定当前的Makefile需要被重新构建; - Make的隐式规则规定:要生成可执行文件
X,会自动寻找X.o作为依赖并链接; - 为了构建
Makefile,Make匹配你的%.o规则,编译test.cpp生成Makefile.o; - 随后Make执行链接命令,将
Makefile.o链接成Makefile,直接覆盖了你原本的文本格式Makefile,生成了二进制可执行文件(这就是原文件被NUL字符和乱码覆盖的原因); - 当Make尝试重新读取这个二进制的
Makefile时,自然会抛出语法错误。
修正方案
- 修复
%.o规则:改成每个.cpp文件对应生成同名.o文件的正确规则:
%.o: %.cpp ${CC} ${CFLAGS} -c $< -o $@
这个规则只会为test.cpp生成test.o,不会触发错误的隐式规则去构建Makefile。
- 修复
re目标:原写法中直接写all会被当成系统命令执行,应该调用Make重新构建:
re: fclean ${MAKE} all
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

