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

执行touch test.cpp后Makefile规则异常,覆盖文件求原因解析

问题原因分析

你的Makefile出现异常的核心问题出在%.o规则的写法上:

%.o:        ${SRCS}
        ${CC} ${CFLAGS} -c $< -o $@

这个规则的逻辑是所有.o文件都依赖test.cpp,并且通过编译test.cpp生成任意.o文件,完全违背了“一个.cpp对应一个.o”的常规编译逻辑。

结合Make的隐式规则和WSL2的文件系统特性,触发异常的流程是:

  1. 执行touch test.cpp后,WSL2可能存在的时间同步问题,导致Make错误判定当前的Makefile需要被重新构建;
  2. Make的隐式规则规定:要生成可执行文件X,会自动寻找X.o作为依赖并链接;
  3. 为了构建Makefile,Make匹配你的%.o规则,编译test.cpp生成Makefile.o;
  4. 随后Make执行链接命令,将Makefile.o链接成Makefile,直接覆盖了你原本的文本格式Makefile,生成了二进制可执行文件(这就是原文件被NUL字符和乱码覆盖的原因);
  5. 当Make尝试重新读取这个二进制的Makefile时,自然会抛出语法错误。
修正方案
  1. 修复%.o规则:改成每个.cpp文件对应生成同名.o文件的正确规则:
%.o: %.cpp
	${CC} ${CFLAGS} -c $< -o $@

这个规则只会为test.cpp生成test.o,不会触发错误的隐式规则去构建Makefile。

  1. 修复re目标:原写法中直接写all会被当成系统命令执行,应该调用Make重新构建:
re: fclean
	${MAKE} all

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:07:00