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
相关产品推荐
相关产品推荐

