编译构建:Makefile在Windows下使用rm指令失败分析

编译构建:Makefile在Windows下使用rm指令失败分析

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感悟

  1. 多搜集现有信息及解决方案,避免反复造轮子。
  2. 山穷水尽之际,多设想,多尝试,即:大胆假设,小心求证。
  3. 做好根因总结,不在同一条河流进入两次。

相关资料


  1. 记录一个Windows下Makefile的神坑,link
  2. windows下Makefile无法删除中间文件的解决方案,link
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值