Win10下Qt 5.15.12编译32位动态库全攻略:环境、配置与避坑
简介:面向 Windows 10 平台 32 位应用开发者的 Qt5.15.12 动态库编译资源,基于 MSVC2019 构建,适合需要在 Win32 架构上维护或新建 C++ GUI 项目的开发者使用。该版本不含 Qt WebEngine,包体更轻,同时保留 TLS 网络通信支持,并同时提供 Debug 与 Release 两种模式,便于调试与最终部署间自由切换。压缩包为 rar 格式,共约 2000 个文件,以头文件为主,涵盖 Widgets、Network、Core 等核心模块及 OpenGL 相关扩展声明,整体约 360.47MB,配合动态库与库文件即可完成项目链接。已有 586 人浏览学习,可作为 32 位 Qt 开发环境搭建与模块查阅的参考素材,帮助读者快速定位所需头文件、理解模块划分并减少重复配置成本。
1. Qt 5.15.12 在 Win10 上编 32 位动态库:先别急着点 configure
上周帮一个做工业上位机的朋友收拾残局:他在 Win10 上要编 Qt 5.15.12 的 32 位动态库,结果源码解压了三遍、MinGW 和 MSVC 混着用、configure 参数抄了半页,最后卡在nmake报找不到qmake。这类环境搭建的坑,十个里有八个不是 Qt 本身的问题,而是工具链位数没对齐、路径带空格、编译器和目标架构错配。Qt 5.15.12 是 5.15 LTS 的收尾版本之一,很多老项目、工控软件、嵌入式上位机还锁在这个版本上,32 位动态库更是刚需——因为现场机器可能还跑着 32 位采集卡驱动。这篇记录按我实际装过的一套流程走:先列清环境,再一步步编,最后告诉你怎么验证产物真能用,以及编坏了从哪儿救。
2. 环境准备:Win10 下 32 位 Qt 5.15.12 的工具链清单
2.1 为什么 32 位动态库要单独编,不能拿官方安装包凑
官方在线安装器给的 Qt 5.15.12 预编译包,Windows 桌面版默认是 MSVC 2019 64 位,32 位版本要么没勾选、要么版本对不上。更关键的是,预编译包用的是官方那套编译参数,你的项目如果需要 OpenSSL、MySQL 驱动、或者特定的-opengl后端,就得自己编。动态库(shared)和静态库(static)的差别也在这里:动态库编出来是.dll+.a(MinGW)或.lib(MSVC),运行时依赖 Qt 的 DLL;静态库全塞进 exe,体积大但部署省心。工控现场一般选动态库,方便单独替换 Qt 模块修 bug。
我一般把编译目录和源码目录分开,源码放D:\qt-src\5.15.12,编译目录放D:\qt-build\5.15.12-mingw32,这样编坏了直接删 build 目录重来,源码不用重新解压。源码包从 Qt 官方归档拿qt-everywhere-src-5.15.12.zip,解压后确认根目录下有configure.bat和qtbase文件夹,缺一个就是包下错了。
2.2 工具链版本对照:MinGW 和 MSVC 怎么选
32 位编译第一条铁律:编译器、Qt 源码、目标架构三者位数必须一致。Win10 上编 32 位 Qt,常见两条路:
| 工具链 | 版本要求 | 优点 | 坑点 |
|---|---|---|---|
| MinGW | 7.3.0 32 位(Qt 官方配套) | 免装 VS,命令行干净 | 必须用 Qt 配套那版,系统里别的 MinGW 会抢 PATH |
| MSVC | VS 2019 + x86 工具集 | 和 Windows SDK 集成好 | 必须开 x86 Native Tools 命令提示符,普通 cmd 是 64 位 |
Qt 5.15.12 官方配套的 MinGW 是 7.3.0,32 位版本在 Qt 安装器的Tools\mingw730_32下能拿到。如果你机器上已经装了 64 位 MinGW,千万别直接拿来用——gcc -dumpmachine输出x86_64-w64-mingw32就说明是 64 位,编出来的东西链接阶段会报架构不匹配。MSVC 路线则要注意:开始菜单里搜 “x86 Native Tools Command Prompt for VS 2019”,从那个窗口进,cl的默认目标才是 x86。
2.3 依赖组件:Perl、Python、jom 一个都不能少
Qt 的 configure 脚本依赖 Perl 处理部分模块生成,Python 用于部分测试脚本,jom 是 Qt 推荐的 nmake 替代品(多核编译快很多)。我踩过的坑是 Perl 装了但没进 PATH,configure 跑到一半报Perl not found,前面十几分钟白等。装完在 cmd 里逐个验证:
perl -v python --version jom /?三条都有输出才算齐。Python 建议 3.8 左右,太新的版本个别脚本会因语法变化报错;Perl 用 Strawberry Perl 即可。jom 从 Qt 官方下载页拿,解压后把目录加进 PATH,或者直接放C:\Qt\jom再配环境变量。另外确认磁盘剩余空间:完整编 32 位动态库,源码加 build 目录至少留 25GB,SSD 上大概 40 分钟到 1 小时,机械盘翻倍。
3. 配置阶段:configure 参数逐项拆解与 32 位对齐
3.1 进对命令行窗口,比参数本身更重要
MinGW 路线:普通 cmd 即可,但要把C:\Qt\Tools\mingw730_32\bin放到 PATH 最前面,避免系统里其他 MinGW 干扰。MSVC 路线:必须从 “x86 Native Tools Command Prompt” 进,进去后先跑cl确认输出里有x86。这一步错了,后面 configure 检测通过、编译到链接才炸,属于最费时间的翻车方式。
进 build 目录前先建好,然后从 build 目录调用源码的 configure:
cd /d D:\qt-build\5.15.12-mingw32 D:\qt-src\5.15.12\configure.bat -prefix D:\Qt\5.15.12\mingw73_32 -platform win32-g++ -debug-and-release -shared -opensource -confirm-license -nomake examples -nomake tests -opengl desktop逐项说:-prefix是安装目录,编完mingw32-make install会往这里装,路径别带空格和中文;-platform win32-g++明确 32 位 MinGW 目标,MSVC 路线换成-platform win32-msvc;-debug-and-release同时出调试和发布两套库,现场排查崩溃时调试库能救命;-shared就是动态库,要静态库改-static;-opensource -confirm-license跳过交互确认;-nomake examples -nomake tests省时间,示例和测试编了也用不上;-opengl desktop用桌面 OpenGL,工控界面渲染兼容性更好,如果项目用 Qt Quick 且现场显卡驱动老,可以改-opengl dynamic让 Qt 运行时选。
3.2 按需裁剪模块,别把用不上的全编进去
Qt 5.15 全家桶模块很多,全编 32 位动态库时间翻倍。我一般先-skip掉确定不用的:
-skip qtwebengine -skip qtwebview -skip qt3d -skip qtcharts -skip qtdatavis3d -skip qtquick3d -skip qtgamepad -skip qtserialbusqtwebengine是重灾区,编它要额外拉 Chromium 依赖,32 位下还容易出问题,上位机项目基本用不到。qtserialbus如果项目确实要 Modbus 通信就留着,别一刀切。裁剪原则:先按项目QT +=里出现的模块列白名单,其余全 skip,编完发现缺模块再单独补编对应子目录,比全量重编省事。
3.3 configure 输出怎么读:三个关键确认点
configure 跑完会打印一屏摘要,重点看三处:Build type是不是debug and release;Architecture是不是x86(32 位);Qt Sql、Qt Network这些你需要的模块是不是yes。如果Architecture显示x86_64,说明工具链位数错了,立刻停,别往下编。摘要最后会提示用mingw32-make还是nmake,MinGW 路线是前者,MSVC 路线是jom或nmake。
提示:configure 失败后不要直接重跑,先看 build 目录下
config.log末尾几十行,90% 的原因(Perl 缺失、编译器找不到、路径含空格)都在里面写明了。
4. 编译与安装:jom 并行编译和产物落位
4.1 并行编译参数:核数不是越大越好
MinGW 路线用mingw32-make -j8,MSVC 路线用jom -j8,数字取物理核数,别取逻辑核数。我见过 16 线程机器开-j16编 Qt,内存直接吃满、编译进程被系统杀掉,报一堆莫名其妙的internal compiler error。8 核机器开-j8比较稳,内存 16GB 以下建议-j4。编译过程中如果某个模块报错,先记下模块名,单独进那个子目录重编,别整个重来:
cd D:\qt-build\5.15.12-mingw32\qtbase mingw32-make -j4qtbase是最容易出问题的模块,OpenSSL 相关报错多半是没装对应 32 位 OpenSSL 或者路径没配,可以先-no-openssl重配跳过,后面单独补。
4.2 install 落位与目录结构确认
编译完成后执行安装:
mingw32-make install产物会按-prefix指定的路径落位,标准结构是bin(qmake、windeployqt 和 DLL)、lib(导入库.a)、include(头文件)、plugins(平台、图像格式等插件)、mkspecs(编译规格)。装完先确认bin\qmake.exe存在,然后跑:
D:\Qt\5.15.12\mingw73_32\bin\qmake.exe -v输出里应包含Qt version 5.15.12且using后面是 32 位 MinGW 的 g++ 路径。如果 qmake 能跑但版本不对,多半是 PATH 里别的 Qt 抢先了,用绝对路径调用即可。
4.3 环境变量与 Qt Creator 挂接
把D:\Qt\5.15.12\mingw73_32\bin加进系统 PATH,然后打开 Qt Creator(版本随意,5.15 配套的 4.x 即可),在工具 > 选项 > Kits里新增一个 Kit:编译器选 32 位 MinGW 的 g++,Qt Version 指向刚编出来的bin\qmake.exe。Kit 建好后新建一个空 Widgets 项目,构建套件选这个新 Kit,能编译能运行,说明这套 32 位动态库环境基本通了。
5. 避坑排查:32 位 Qt 编译最常见的五类翻车
5.1 现象:configure 报 “Cannot find make” 或直接闪退
原因:命令行窗口里没有 make 工具,或者 PATH 里 MinGW 的 bin 没加对。MSVC 路线常见于从普通 cmd 进,nmake不在 PATH。解决:MinGW 路线确认mingw32-make -v有输出;MSVC 路线换 x86 Native Tools 窗口,或手动跑vcvars32.bat。闪退则看config.log,多半是 Perl 或 Python 缺失导致脚本提前退出。
5.2 现象:编译到链接阶段报 “file format not recognized” 或架构不匹配
原因:混入了 64 位目标文件或库。典型场景是 PATH 里 64 位 MinGW 排在前面,或者项目里链接了 64 位的第三方.a。解决:gcc -dumpmachine确认是i686开头;检查-L路径下的第三方库是否 32 位;必要时在 configure 前把 PATH 清干净,只留 32 位工具链。
5.3 现象:qmake 能跑,但编译项目时报 “undefined reference to__imp_...”
原因:动态库链接时缺导入库,或者链接顺序不对。Qt 5.15 下常见于手动写.pro时LIBS顺序把依赖库放在使用它的库前面。解决:LIBS += -lQt5Core这类按依赖顺序从底层往上写;确认lib目录下有对应.a文件;用qmake -query看QT_INSTALL_LIBS指向是否正确。
5.4 现象:程序在开发机跑得好,拷到现场机器报缺 DLL
原因:动态库部署没带齐插件。Qt 程序除了核心 DLL,还依赖platforms\qwindows.dll、图像格式插件、以及 MinGW 运行时libgcc_s_seh-1.dll、libstdc++-6.dll、libwinpthread-1.dll。解决:用编出来的windeployqt.exe自动收集:
D:\Qt\5.15.12\mingw73_32\bin\windeployqt.exe --release --compiler-runtime D:\build\app\release\app.exe--compiler-runtime会把 MinGW 运行时一起拷过去,现场机器没装 MinGW 也能跑。
5.5 现象:编到一半磁盘满或内存被杀,重编又从头开始
原因:Qt 全量编译中间文件巨大,-j开太大内存扛不住。解决:build 目录单独放一块空间充足的盘;-j按内存调,16GB 内存开-j4;已经编过的模块不会重编,中断后直接重跑 make 即可续上,不用删 build 目录。
6. 装完怎么验证:三步确认 32 位动态库真能用
编完不等于能用,我习惯走三步验证,少一步都可能在现场翻车。第一步,确认产物位数:用 Dependency Walker 或dumpbin /headers(VS 工具)打开bin\Qt5Core.dll,看 machine 字段是不是x86;MinGW 下也可以objdump -f Qt5Core.dll,输出file format pe-i386才对。第二步,跑一个最小程序:新建控制台项目,QT += core,打印QT_VERSION_STR和QSysInfo::buildCpuArchitecture(),输出5.15.12和i386说明库和架构都对。第三步,模拟部署:把 exe 和windeployqt收集的目录拷到一台没装 Qt 的 Win10 机器(或干净虚拟机),双击能起来、界面正常、串口或网络模块能初始化,才算真正跑通。
| 验证项 | 命令/方法 | 通过标准 |
|---|---|---|
| DLL 位数 | objdump -f Qt5Core.dll | pe-i386 |
| 版本与架构 | 最小程序打印 | 5.15.12/i386 |
| 干净机部署 | windeployqt 后拷机运行 | 无缺 DLL 弹窗 |
有个细节容易漏:windeployqt默认按它自己所在 Qt 的架构收集,如果你 PATH 里混了 64 位 Qt,它可能拷错 DLL。所以跑之前用绝对路径调用刚编出来的那个windeployqt.exe,跑完再抽查platforms\qwindows.dll的位数。从那以后我每次编完 32 位 Qt,都强制走一遍这三步,尤其是干净机那步——开发机上什么依赖都全,缺 DLL 的问题只有拷到现场机器才暴露。希望帮到你。
本文还有配套的精品资源,点击获取