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

Windows 10 Mingw环境下Protobuf 2.6.0 Makefile执行报错求助

在MinGW下编译Protobuf 2.6.0时mingw32-make报错的解决方案

我之前也碰到过类似的坑,你这个情况是典型的Windows cmd和Unix shell语法冲突导致的。先把问题场景和报错信息理清楚:

你在Windows系统用MinGW安装Protobuf 2.6.0时,./configure已经成功生成了Makefile,但执行mingw32-make时出现以下错误:

C:\Users\taka\gz-ws\protobuf-2.6.0> mingw32-make
! était inattendu. //翻译:"! 未被预期"
Makefile:558: 目标'config.h'的生成规则失败
mingw32-make: *** [config.h] Error 255

对应的Makefile第558行内容是:

config.h: stamp-h1
@if test! -f $@; then rm -f stamp-h1; else :; fi...

问题根源

这个报错的核心是Windows cmd的语法和Unix shell不兼容:test! -f $@里的!在cmd中是延迟环境变量展开的特殊符号,cmd会把它当成命令的一部分解析,而不是传递给test命令,所以才会出现“! 未被预期”的错误。

三种可行的解决方法

1. 切换到MSYS环境执行make

这是最推荐的方案,因为MSYS是MinGW配套的类Unix shell环境,能完美解析configure生成的Makefile中的Unix风格命令:

  • 打开MinGW的MSYS终端(一般在MinGW安装目录下的msys/1.0/msys.bat)
  • 切换到你的Protobuf源码目录(比如cd /c/Users/taka/gz-ws/protobuf-2.6.0)
  • 重新执行mingw32-make即可

2. 修改Makefile中的条件判断语句

如果一定要在Windows cmd中执行,可以手动修改Makefile第558行的内容,把Unix风格的test命令换成cmd兼容的写法:
把原来的:

config.h: stamp-h1
	@if test! -f $@; then rm -f stamp-h1; else :; fi

替换成cmd兼容的版本:

config.h: stamp-h1
	@if not exist $@ (del /Q stamp-h1) else (echo.)

修改后保存Makefile,再重新运行mingw32-make。

3. 关闭cmd的延迟变量展开

临时关闭cmd的延迟变量展开功能,这样!就不会被当作特殊字符处理:

  • 在cmd中先执行命令:cmd /V:off
  • 然后切换到源码目录,执行mingw32-make

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:19:40