Windows下MinGW运行Makefile报错:obj/main.o目标规则执行失败
解决Windows下MinGW执行Makefile时mkdir语法错误的问题
问题原因
你遇到的mkdir -p ./obj/语法错误,本质是Windows原生mkdir不支持Unix风格的-p参数。即使安装了MinGW,如果mingw32-make默认调用Windows系统的cmd.exe作为shell,执行的是Windows自带的mkdir命令,而非GNU工具链里的mkdir,就会触发这个错误。
解决方案
方法1:改用Windows兼容的目录创建命令
把Makefile里的mkdir -p $(OBJ_PATH)替换为Windows cmd支持的写法:
$(OBJ_PATH)%.o: %.c if not exist $(OBJ_PATH) mkdir $(OBJ_PATH) $(CC) $(CF) $(CFI) -c $< -o $@
如果需要递归创建多级目录(比如obj/subdir/),Windows原生mkdir不支持递归,可改用PowerShell命令替代:
$(OBJ_PATH)%.o: %.c powershell -Command "New-Item -ItemType Directory -Force -Path $(OBJ_PATH)" $(CC) $(CF) $(CFI) -c $< -o $@
方法2:强制使用MinGW的GNU Shell
在Makefile最顶部添加一行,指定使用MinGW自带的bash作为执行shell,这样就能正常识别Unix风格的命令参数:
# 放在Makefile最顶部,根据你的MinGW安装路径调整 SHELL := C:/MinGW/bin/bash.exe # 若MinGW/bin已在系统PATH中,也可简化为: # SHELL := /bin/bash # 原规则保持不变 $(OBJ_PATH)%.o: %.c mkdir -p $(OBJ_PATH) $(CC) $(CF) $(CFI) -c $< -o $@
方法3:调整PATH优先级确保GNU工具优先
检查系统PATH环境变量,将MinGW的bin目录(比如C:\MinGW\bin)移到最前端,这样mingw32-make会优先调用GNU版本的mkdir,而非Windows自带命令。
额外注意事项
你的Makefile里还有两个Windows环境下无法正常工作的目标:
install目标中的sudo apt-get是Linux系统的包管理命令,Windows下无法执行。若需安装readline库,需手动下载MinGW适配版本并配置路径。leak目标中的valgrind是Linux专属的内存泄漏检测工具,Windows无原生支持版本,可改用Visual Studio内存检测工具或其他Windows兼容方案替代。
内容的提问来源于stack exchange,提问作者prezadopedro
相关产品推荐
相关产品推荐

