# Windows批处理中SET对errorlevel的影响 今天折腾自己编译QT,在`configure`阶段遇到了一点麻烦,网上也没看到解决方法,所以纪录在此。 按文档说明,写了一长串命令之后确认运行: configure.bat -static -release -debug -confirm-license -opensource -opengl desktop -platform win32-g++ -prefix "C:\Documents\dev\lib\qt-5-build\mingw-7.2.0-posix-static" -sql-sqlite -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -make libs -nomake tools -nomake examples -nomake tests -skip qtwebview -skip qtwebengine -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtfeedback -skip qtgamepad -skip qtlocation -skip qtquick1 -skip qtquickcontrols -skip qtquickcontrols2 -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtwebchannel 然而,只出了一句提示说“正在运行`qtbase`下的`configure`”之后就没了,瞬间结束。本来应该`bootstrap`出来一个`qmake.exe`的`qtbase/bin`目录是空的,`echo %errorlevel%`显示为1,显然是脚本出错了。 搜索半天后确认没有任何中文或者鸟语资料提到这个,于是在`qtbase`下的`configure.bat`的顶端打开了`echo on`,确定问题出在这里: :wastoplevel set SYNCQT= set PLATFORM= set MAKE= call :doargs %ARGS% if errorlevel 1 exit /b goto doneargs 运行到`if errorlevel 1 exit /b`一句时,脚本发现`errorlevel`为1,就直接退出了。 添加很多`echo %errorlevel%`之后再次运行,发现,刚刚进入`:wastoplevel`时`errorlevel`是好着的,但是运行到`call :doargs %ARGS%`时,就变成坏的了。这让我很惊讶,看似人畜无害的`set SYNCQT=`也会出错? 再经过一番尝试,发现了`SET XXX=`命令的作用是: 1. 如果`XXX`变量已经存在,则什么也不做,**而不是我之前理解的把这个变量置为空!** 2. 如果`XXX`变量不存在,则将`errorlevel`置为1. 这么来看,这句话的作用实质上应该是**检查变量`XXX`是否存在**,不存在则报错。而`Qt`编译脚本中为啥放上了这一句但又不在文档中提及就不得而知了,也许是以前`:doargs`函数中有什么命令可以刷掉错误的`errorlevel`,但可以确认在5.9版本中是没有的。 知道原因后,解决就很简单了,首先读一下脚本确定那三个变量的意思,然后在执行`configure`之前先把他们设置一下: SET SYNCQT=false set PLATFORM=win32-g++ set MAKE=mingw32-make 再继续按官方文档搞就好了。