Windows下mingw32-make执行move命令失败问题求助
双平台Makefile中Windows下move命令执行失败问题排查
问题场景
- 项目为跨Windows(使用mingw32-make)和Linux(WSL)的Makefile工程,目录结构包含
src(含子Makefile)、obj、man、bin - 执行逻辑:通过
$(MANTOOL)工具将文本文件转为HTML文件(生成在src目录),再通过$(MOVE)命令将所有*man.html文件移动到上级目录的man文件夹 - 异常现象:Linux/WSL环境下执行完全正常;Windows下用mingw32-make执行时,
move /Y *man.html ..\man命令报错“找不到指定文件”,但手动在src目录执行该命令却能成功
相关Makefile代码
顶层Makefile
.PHONY:man man: $(MAKE) man -C src
src目录子Makefile
.PHONY:man man: @echo Creating manpages... $(MANTOOL) $(mantextfiles) @echo Installing manpages in man directory... $(MOVE) *man.html $(MANDIR)
核心原因解析
Shell进程的独立执行特性
mingw32-make默认调用Windows的cmd.exe作为Shell,但Make会为每一条命令单独启动一个全新的cmd进程。Windows的cmd默认不会在单独启动的命令进程中自动解析通配符*,也就是说move命令收到的参数是字面意义的*man.html,而非展开后的实际文件名列表,系统自然找不到这个不存在的文件。而手动执行时,你是在同一个cmd会话中,通配符会被正常解析。通配符解析的环境差异
Linux下的bash会自动处理通配符展开,所以*man.html会被替换成所有匹配的文件名;但Windows的cmd没有这个默认行为,必须依赖特定的环境配置或命令写法才能完成通配符解析。
解决办法
方法1:用PowerShell处理通配符
替换src子Makefile中的move命令为PowerShell执行,PowerShell原生支持通配符扩展:powershell -Command "Move-Item -Path *man.html -Destination $(MANDIR) -Force"方法2:让cmd主动解析通配符
通过cmd /c的方式强制通配符在命令执行前被解析:cmd /c move /Y *man.html $(MANDIR)方法3:用Make的wildcard函数提前展开文件名
在src子Makefile中先通过Make的内置函数获取所有匹配的文件名,再传给move命令:MAN_HTML_FILES := $(wildcard *man.html) $(MOVE) $(MAN_HTML_FILES) $(MANDIR)
内容的提问来源于stack exchange,提问作者Daniel Evans
相关产品推荐
相关产品推荐

