@echo off setlocal call C:\software\Qt5.5.1\5.5\mingw492_32\bin\qtenv2.bat cd /d D:\project\zhzh\ChartApp C:\software\Qt5.5.1\5.5\mingw492_32\bin\qmake.exe ChartApp.pro -spec win32-g++ C:\software\Qt5.5.1\Tools\mingw492_32\bin\mingw32-make.exe %* if errorlevel 1 exit /b 1 if exist bin\ChartApp.exe ( C:\software\Qt5.5.1\5.5\mingw492_32\bin\windeployqt.exe --release --no-translations bin\ChartApp.exe ) echo Build OK: ChartApp\bin\ChartApp.exe echo Enclib: ..\Enclib_windows\Enclib endlocal参考文件:
Windows 批处理文件 xxx.bat-CSDN博客
这个.bat文件是一个Qt 项目的编译构建脚本,用于在 Windows 下使用 MinGW 编译器编译ChartApp.pro项目,并自动部署所需的 Qt 运行库。
第 1 行:@echo off
关闭命令回显,执行时不显示每行命令本身,让输出更清爽。
第 2 行:setlocal
开始局部环境变量作用域,后续设置的变量和路径修改只在脚本内有效,不影响系统全局环境。
第 3 行:call C:\software\Qt5.5.1\5.5\mingw492_32\bin\qtenv2.bat
call用于调用另一个批处理文件,并等待它执行完毕后返回继续执行当前脚本。qtenv2.bat是 Qt 自带的环境配置脚本,它会自动设置 Qt 相关的环境变量(如PATH、QTDIR等),让后续的qmake、mingw32-make等命令能够找到对应的库和工具。如果不用
call直接写路径,脚本会跳转到那个 BAT 文件执行且不再返回,后面的命令都不会执行。
第 4 行:cd /d D:\project\zhzh\ChartApp
切换到项目源码根目录(ChartApp.pro所在的位置)。
第 5 行:C:\software\Qt5.5.1\5.5\mingw492_32\bin\qmake.exe ChartApp.pro -spec win32-g++
调用
qmake生成 Makefile。ChartApp.pro是 Qt 项目文件。-spec win32-g++指定使用 MinGW 编译器(而不是 MSVC)。执行后会在当前目录生成
Makefile和Makefile.Debug/Makefile.Release等文件。
第 6 行:C:\software\Qt5.5.1\Tools\mingw492_32\bin\mingw32-make.exe %*
调用
mingw32-make(MinGW 的 make 工具)根据刚才生成的 Makefile 进行编译和链接。%*表示将调用本脚本时传入的所有参数原样传递给 make。例如,如果你执行build.bat -j4,那么-j4会被传给 make,实现多核并行编译。如果编译过程中出错,
mingw32-make会返回非零错误码。
第 7 行:if errorlevel 1 exit /b 1
errorlevel是上一条命令的返回值(mingw32-make的退出码)。如果
errorlevel >= 1(即编译失败),立即退出脚本,并返回1(表示失败)。/b 1表示退出当前批处理脚本(而不是关闭整个 CMD 窗口),返回码为1。
第 8-10 行:if exist bin\ChartApp.exe ( ... )
检查编译出的可执行文件
bin\ChartApp.exe是否存在。如果存在,则执行
windeployqt.exe(Qt 官方部署工具):--release:只部署Release 版本的库(不包含 Debug 版本)。--no-translations:不复制翻译文件(.qm文件)。bin\ChartApp.exe:指定目标 exe 文件。
windeployqt会自动将程序依赖的 Qt 核心库(如Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll等)和必要的插件(如 platforms 目录)复制到bin目录下,让 exe 可以在没有安装 Qt 的电脑上直接运行。
第 11 行:echo Build OK: ChartApp\bin\ChartApp.exe
输出构建成功的提示信息,告诉用户生成的可执行文件位置。
第 12 行:echo Enclib: ..\Enclib_windows\Enclib
输出一个额外的提示信息,可能用于提醒依赖库(Enclib)的位置(Enclib_windows可能是加密或底层库)。这只是输出文字,并没有实际复制或操作该库。
第 13 行:endlocal
结束setlocal开启的局部环境,恢复脚本执行前的环境变量状态(包括PATH等)。
为了适配我的电脑(我安装的是Qt5.12.8),我修改了下脚本内容:
rem @echo off rem setlocal call D:\Qt\Qt5.12.8\5.12.8\mingw73_32\bin\qtenv2.bat cd /d D:\QtCode\zhzhv1\ChartApp D:\Qt\Qt5.12.8\5.12.8\mingw73_32\bin\qmake.exe ChartApp.pro -spec win32-g++ D:\Qt\Qt5.12.8\Tools\mingw730_32\bin\mingw32-make.exe %* if errorlevel 1 exit /b 1 if exist bin\ChartApp.exe ( D:\Qt\Qt5.12.8\5.12.8\mingw73_32\bin\windeployqt.exe --release --no-translations bin\ChartApp.exe ) echo Build OK: ChartApp\bin\ChartApp.exe echo Enclib: ..\Enclib_windows\Enclib rem endlocal pause运行了下程序,没有什么问题,可以正常运行。
我执行.bat,直接双击,但这样看不了打印信息啊?
在文件末尾加
pause(最简单)在脚本最后一行加上
pause,窗口就会停留在“按任意键继续...”的状态