
简介面向Qt5应用开发者的MinGW静态编译环境套件基于Qt5.14.2与MinGW 7.3.0 32位配置预编译完成免去从源码编译静态库的长时间等待以及参数设置错误后必须重新编译的反复挫折。开发者只需在Qt Creator中挂接该编译套件即可直接构建不依赖Qt动态库的Windows程序进而方便制作绿色免安装软件、交付独立演示程序或简化CI流水线中的依赖安装环节适合希望产出单文件交付物、面向分发场景的中级及以上C/Qt工程师。压缩包为rar格式整体约865.59MB由于文件清单与类型明细未单独列出包内核心可理解为编译好的Qt静态库、与MinGW 7.3.0匹配的工具链设置以及相关生成配置可结合配套博客中的添加步骤快速上手。目前已有998人下载学习说明该预置套件在静态编译需求中具有较高实用价值。对于需要反复验证静态链接参数、避免每次重建环境浪费时间、或是希望缩短项目准备周期的开发者这套环境能明显减少从零搭建的成本和复杂度。1. 静态编译的 Qt5.14.2 MinGW 7.3.0 32 位套件解决的不只是打包问题在 Windows 上分发 Qt 程序最常见的翻车现场是“缺少 Qt5Core.dll”。Qt 官方安装包默认只提供动态编译的库发布前要么带一整套 bin 目录要么用 windeployqt 补依赖。这个静态编译资源把 Qt5.14.2 和 MinGW 7.3.0 (32 位) 的静态库完整打包解压后不需要再跑 configure 和 make直接在 Qt Creator 里添加套件。它的价值在于一次把静态库编出来后面所有项目共享。对工控上位机、需要拷贝到老 Windows 设备的绿色软件、想减少现场环境变量的开发来说这套东西很实用。2. 静态链接与动态链接的取舍Qt5.14.2 离线安装包默认给不了的东西官方 Qt5.14.2 离线安装包下载后能省很多事但它的编译器套件是动态链接模式。要理解为什么需要这份静态套件先看一组对比。2.1 静态库、动态库与最终 exe 的关系动态链接下Qt 代码编译成 Qt5Core.dll、Qt5Widgets.dll 等独立文件exe 的导入表里记录的是 DLL 名称程序启动时由 Windows 加载器在 PATH、可执行文件目录和系统目录里找 DLL。静态链接下qt 的代码被打进 libQt5Core.a 这类归档文件链接器只把工程实际用到的目标文件抽出来合并进 exe最后生成的产品不依赖任何 Qt DLL。判断一个程序是不是静态链接不要看编译时有没有报错要看最终 exe 的导入表。动态 Qt 程序的导入表里通常有几十个Qt5*.dll静态程序导入表里只有 KERNEL32.dll、USER32.dll、GDI32.dll、SHELL32.dll 这类系统库。这个差异直接决定了部署方式动态发布要带着 Qt 的bin目录走静态发布只需要一个 exe。2.2 官方安装包和静态套件的差异对比项官方 Qt5.14.2 动态套件本文静态编译套件链接方式exe DLL 动态导入Qt 目标文件直接链入 exe发布目录需携带 Qt bin、platforms 插件一般只需单个 exe环境依赖目标机器缺失 DLL 立即启动失败不依赖目标机安装 Qt程序体积空 QWidget 程序约 1~3 MB空 QWidget 程序约 10~15 MBdebug/release官方包同时带 debug 和 release一般只编 release避免编双份补丁替换替换对应 DLL 即可需要重新编译整个工程首次构建时间安装即用自己编译源码需数小时本资源省掉这个表不是对比优劣而是说明为什么工程里常常两套并存。开发阶段用官方动态套件编译快、调试符号好找交付阶段用静态套件拷到现场机器上不容易出问题。32 位在这里不是落后Qt5.14.2 是最后几代对 Windows 7 和 32 位系统支持较好的版本之一工控行业的老设备经常就是 32 位系统跑不了 64 位程序。2.3 自己编译静态 Qt 的关键参数如果手里没有现成静态套件从源码编译一次要占用机器一到两个小时中间任何一个参数错误都会导致 make 到一半退出清空 build 目录重新再来。常见做法是在 Qt 自带的 MinGW 环境里执行./configure -static -release -platform win32-g \ -prefix C:/Qt/Qt5.14.2_mingw73_32_static \ -opensource -confirm-license \ -nomake examples -nomake tests -no-opengl mingw32-make -j4 mingw32-make install参数说明-static决定生成静态库-release只编发布版能省一半时间-platform win32-g指定 MinGW 平台的 mkspec-prefix是安装路径。-no-opengl是常见裁剪项如果项目需要 OpenGL 就必须去掉。-nomake examples -nomake tests避免把样例和测试全部编一遍。实际编译过程中configure 脚本可能因为 Perl、编译器的路径问题提前失败这也是静态套件mingw73版本能直接用的价值所在。这里还要补一句许可证层面的常识Qt 5.14.2 开源版默认是 LGPL动态链接相对省事静态链接对外分发时通常需要提供目标文件或给使用者自行重新链接的机会。内部工具和自用程序不用纠结涉及到对外商业交付时应有合规检查。3. Qt Creator 编译套件挂载从解压到构建第一个 32 位静态程序拿到压缩包后不要急着把 qmake 塞进 PATH。先确认目录结构再在 Qt Creator 里按“编译器 - Qt 版本 - 构建套件”的顺序添加最后用命令行验证一次这条路走通后后续项目都可以直接复用套件。3.1 先看清目录结构静态 Qt 和动态 Qt 解压后长得不一样动态库通常在bin下放一堆Qt5*.dll静态版没有这些 DLL取而代之的是lib下的.a文件。C:\QtStatic\Qt5.14.2_mingw73_32\ |-- bin | |-- moc.exe | |-- uic.exe | |-- rcc.exe | -- qmake.exe |-- include | -- QtCore |-- lib | |-- libQt5Core.a | |-- libQt5Gui.a | |-- libQt5Widgets.a | -- libQt5Network.a |-- mkspecs | -- win32-g -- plugins -- platforms -- libqwindows.a路径里的plugins\platforms是静态插件不是 DLL。Qt 的 Windows 平台插件在静态编译时也被编成.a程序要运行必须把这个插件链进去否则会出现 “could not find or load the Qt platform plugin windows”。后面第 4 章会讲到用QTPLUGIN qwindows处理。3.2 Qt Creator 添加编译套件的步骤打开 Qt Creator依次进入“工具 - 选项 - Kits”。先切到“编译器”页面点击“添加 - MinGW”编译器路径选择 MinGW 7.3.0 32 位的 g例如C:\Qt\Qt5.14.2\Tools\mingw730_32\bin\g.exe。Qt Creator 会自动识别 C 和 C 编译器如果识别成x86_64说明选错了 g要检查是不是选到了 64 位目录。然后切到“Qt Versions”页面点“添加”浏览到静态套件根目录下的qmake.exe。Qt Creator 会读取 qmake 信息并显示 Qt 5.14.2 (MinGW 7.3.0 32-bit)。如果显示为 “Unknown”通常是路径里包含中文或空格换个纯英文路径解压即可。最后切到“构建套件”页面添加一个新的 Kit名字写Qt5.14.2 static mingw73 32编译器选刚才添加的 MinGW 编译器Qt Version 选静态 qmakeCMake 工具留默认。重点确认 ABIs 一栏显示的是 32 位格式比如x86-windows-msys-pe-32bit如果显示x86_64或Unknown后面构建会带上错误的目标平台参数。3.3 命令行验证 qmake 是否生效在 Qt Creator 里挂载套件之前建议先用命令行确认环境变量没有问题。打开控制台执行set PATHC:\QtStatic\Qt5.14.2_mingw73_32\bin;C:\Qt\Qt5.14.2\Tools\mingw730_32\bin;%PATH% qmake -v qmake -query QT_VERSION qmake -query QMAKE_XSPEC g -dumpmachine四条命令的作用qmake -v打印 qmake 版本应当显示Using Qt version 5.14.2QT_VERSION确认核心版本QMAKE_XSPEC显示win32-g只有静态套件目录下的 qmake 才会返回这个值g -dumpmachine输出i686-w64-mingw32代表编译器目标是 32 位。如果g -dumpmachine输出x86_64说明 PATH 里的编译器来自另一个 64 位套件ABI 对不上构建时会报一堆 “undefined reference” 错误。需要注意一个常见坑这套静态库是用-release模式构建的没有 debug 版库文件。在 Qt Creator 里用这套 Kit 构建时项目构建套件必须选 Release不能选 Debug。Debug 模式下链接器会去找libQt5Cored.a这类带d后缀的库找不到就直接失败。4. 静态链接实战pro 文件、编译参数与部署目录套件挂载成功后接下来要做的是把一个 Qt Widgets 工程改成静态构建并且在最终 exe 里验证没有 Qt DLL 依赖。4.1 让 qmake 生成静态程序的 pro 配置假设工程是一个带界面的简单程序demo_static.pro可以这样写TEMPLATE app TARGET demo_static QT core gui widgets CONFIG release CONFIG - debug win32 { QMAKE_LFLAGS -static-libgcc -static-libstdc QTPLUGIN qwindows }QT core gui widgets是 Qt Widgets 程序的标准三件套。CONFIG release和CONFIG - debug是为了保证链接参数里的库名不带d后缀。QMAKE_LFLAGS -static-libgcc -static-libstdc是静态编译里很容易漏掉的一项它让 MinGW 的 libgcc 和 libstdc 运行库也进入 exe否则程序运行时会依赖libgcc_s_dw2-1.dll或libstdc-6.dll。QTPLUGIN qwindows告诉 qmake 把 Windows 平台插件链进来不加这一行的典型报错是双击程序后提示找不到 platform plugin。4.2 常用 CONFIG 参数说明参数作用配合本套件的建议CONFIG release开启优化并链接 release 库必须静态套件没有 debug 库CONFIG - debug避免附加 debug 宏和调试库必须QMAKE_LFLAGS -static-libgcc -static-libstdc静态链接 gcc 运行库建议加减少外部 DLLQTPLUGIN qwindows静态链接 qwindows 平台插件必须否则无法启动 GUICONFIG console生成控制台子系统程序调试 qDebug 时临时用CONFIG console这个参数容易被忽略静态程序在 stdout 里打印日志很方便但发布时一般要去掉改回 Windows GUI 子系统否则每次启动都会弹出黑色控制台窗口。4.3 编译命令在工程根目录新建 build 目录避免源码目录被生成的中间文件污染mkdir build-static cd build-static set PATHC:\QtStatic\Qt5.14.2_mingw73_32\bin;C:\Qt\Qt5.14.2\Tools\mingw730_32\bin;%PATH% qmake ..\demo_static.pro -spec win32-g CONFIGrelease mingw32-make -j4-spec win32-g指定 mkspec方法同样适用于 CMake 工程只要把CMAKE_PREFIX_PATH指到静态 Qt 根目录。-j4是并行编译参数机器核数少可以改成-j2核多可以改成-j8静态链接阶段比较吃内存并行任务数不宜超过物理核数太多。4.4 验证最终 exe 没有 Qt 依赖编译成功后用 MinGW 自带的 objdump 查看导入表objdump -p release\demo_static.exe | grep DLL Name正常静态链接程序的输出大致是DLL Name: KERNEL32.dll DLL Name: USER32.dll DLL Name: GDI32.dll DLL Name: SHELL32.dll DLL Name: ole32.dll DLL Name: WINMM.dll只要没有出现Qt5Core.dll、Qt5Widgets.dll、libgcc_s_dw2-1.dll就说明 Qt 和 MinGW 运行库都已经进入 exe。如果输出里还有Qt5*.dll排查顺序是qmake 是否来自静态套件、构建时是否用了 Release、QMAKE_LFLAGS是否在win32作用域内。如果输出里还有libwinpthread-1.dll说明 pthread 运行库没有静态化可以在QMAKE_LFLAGS中补一个-Wl,-Bstatic -lpthread -Wl,-Bdynamic但大多数界面程序用不到。5. 交付前验证在一个干净环境里自检静态套件套件是否真的可用不能只靠 Qt Creator 里编译通过关键要看脱离开发环境后能不能跑起来。5.1 用最小程序做冒烟测试新建一个只弹版本号的最小工程编译后拿它做验证比用完整业务工程更容易定位问题#include QApplication #include QMessageBox #include QtGlobal int main(int argc, char *argv[]) { QApplication app(argc, argv); QMessageBox::information(nullptr, static check, qVersion()); return app.exec(); }把这个 exe 拷贝到一台没有安装 Qt 的 Windows 虚拟机里双击如果能弹出内容为5.14.2的窗口说明 Qt 静态库和 qwindows 插件都链成功了。如果弹出The procedure entry point ... could not be located通常是混用了不同版本的 Qt 库优先检查PATH里是否残留另一个 Qt 的 bin 目录。5.2 写一个自动依赖检查批处理每次交付前人工看 objdump 输出太慢可以直接写一个批处理把 exe 拖上去就能判断echo off set PATHC:\Qt\Qt5.14.2\Tools\mingw730_32\bin;%PATH% objdump -p %~1 | findstr /i Qt5.dll nul if %errorlevel%0 ( echo UNEXPECTED_QT_DLL ) else ( echo OK_NO_QT_DEP )逻辑说明%~1是拖入脚本的 exe 路径findstr /i Qt5.dll只匹配导入表里的 Qt DLL 名字不匹配程序路径和文件名errorlevel为 0 表示找到了 Qt5.dll此时构建产物有问题为 1 表示干净。这个脚本不需要额外工具任何装了 MinGW 的机器都能跑。5.3 最后再确认一次 ABI静态套件能用不代表 32 位目标一定正确建议把 qmake 和编译器的输出拼在一起检查qmake -query QT_VERSION qmake -query QMAKE_XSPEC g -dumpmachineQT_VERSION应返回5.14.2QMAKE_XSPEC应返回win32-gg -dumpmachine应返回i686-w64-mingw32。三条结果任意一条不是 32 位或不是 MinGW都要回 Qt Creator 里重建 Kit。把这条检查命令放进持续集成脚本里任何一次编译器替换或 PATH 污染都会在构建日志里立刻显示出来。本文还有配套的精品资源点击获取