Windows平台用Makefile无法删除中间件?Makefile删除编译中间件时报错:系统找不到指定文件,如何解决?
分析框架
- 问题背景 What
- 解决方案 How
- 现象分析 Why
问题背景
问题起因是有个项目文件修改后,增量编译.c与.o文件时常更新不同步,导致基线效果分析错误。就想,如何避免增量编译失效?
首先,提出问题:Makefile如何关闭增量编译?后来发现它根据依赖链,自动推导增量式编译,没看到开关,故此路不通。
接着,换个思路:如果能每次编译后自动删掉.o中间件,也能达到同样目标。
最后,跟着关联问题引出了下面的解决方案和现象分析。
解决方案
太长不看直接总结版:
- 最常见的是,用del替换rm
- 尝试clean后的指令添加
"" - 【重点有效】如果是在powershell里失败,用
git bash界面进去make,从而正常使用rm指令
有兴趣探索根因的同学,咱们接着往下研究。
现象分析
报错现象
报错1:make (e=2): 系统找不到指定的文件。make[1]: [clean] Error 2
- 输入:del $(OBJS) $(DEMO_OBJS)
报错2:process_begin: CreateProcess(NULL, … No such file or directory make: [clean] Error 127。
- 输入:“del $(OBJS) $(DEMO_OBJS)”
接着,我尝试了以下修改均无效:
rm -f $(OBJS) $(DEMO_OBJS)
"rm -f $(OBJS) $(DEMO_OBJS)"
del $(OBJS) $(DEMO_OBJS)
"del $(OBJS) $(DEMO_OBJS)"
cmd /C "del *.o"
rm -rf $(wildcard *.o)
rm -f D:/workspace/demo.o # 单点尝试,说明rm此时无效
"rm -f D:/workspace/demo.o" # 验证双引号
然后,我从参考资料2中,突然想到会不会是powershell对rm存在指令兼容问题,便进入git bash,尝试上面第1行指令,竟然OK了!
根因分析
有了结果,那兄弟我就要胡乱分析一波啦。
我再尝试了下,同样的指令在cmd窗口/powershell调用都是失败,说明powershell的壳调用失效(在终端预览中打开也是调powershell),不如git bash在windows下稳定。
如何在编译完后自动删除.o文件,而不是每次都用make clean?
- 在all冒号后目标对象后,添加clean。
- 举例:
all: $(DEMO) clean
Debug感悟
- 多搜集现有信息及解决方案,避免反复造轮子。
- 山穷水尽之际,多设想,多尝试,即:大胆假设,小心求证。
- 做好根因总结,不在同一条河流进入两次。
2009

被折叠的 条评论
为什么被折叠?



