简介:面向Windows平台Qt开发者的Qt 5.15.16编译成品库,基于VS2019工具链构建,可直接用于32位与64位桌面应用开发,省去自行编译源码的时间成本。压缩包共约2000个文件,以1548个C++头文件为主体,覆盖QtCore、QtGui、QtWidgets、QtTest、OpenGL及Vulkan等模块的类声明;另含少量json、pri工程配置与模块依赖描述文件,整体约753MB,include、lib、plugins、bin四类目录分工明确,便于按模块引用与部署。已有874人学习下载,适合需要稳定Qt运行库、希望跳过漫长编译流程的中级开发者,也便于对照头文件梳理模块依赖与插件机制,快速集成到既有工程中。
1. Qt 5.15.16 源码编译:为什么在 Win10 + VS2019 上自己编一遍更省心
装完 Qt 官方在线安装器,打开工程发现调试器版本对不上、某个模块缺库、想裁掉 WebEngine 又裁不掉——这类事在 Win10 上做桌面开发的人多少都碰过。Qt 5.15.16 是 5.15 LTS 分支的后期维护版本,官方二进制包默认按特定 MSVC 工具链构建,一旦你的 VS2019 环境、Windows SDK 版本或第三方库 ABI 有偏差,链接期就会冒出一堆 unresolved external。自己从源码编一遍,本质是把工具链、模块裁剪、调试符号三件事一次性对齐到自己的机器上,代价是几十分钟到两小时的编译时间。这篇笔记面向需要在 Win10 + VS2019 下稳定产出 Qt 库的从业者,从环境准备、configure 参数、nmake 编译到踩坑排查,按能照着复现的粒度写。
2. 编译前的环境对齐:VS2019、SDK 与源码目录怎么摆
2.1 工具链版本组合与依赖清单
Qt 5.15.16 的源码构建对 MSVC 版本有明确下限要求,VS2019(MSVC 19.2x)是官方支持范围内的组合。真正容易翻车的不是 VS 本身,而是 Windows SDK 版本和 Perl、Python 这两个构建期依赖。configure 脚本在 Windows 上需要 Perl 处理部分生成逻辑,Python 用于部分模块的构建脚本,两者都要在 PATH 里能被找到,且不能是 Microsoft Store 版的别名 stub——Store 版 python.exe 在脚本调用时会弹应用商店,直接让 configure 中断。
我一般按下面这张表核对,缺一项就先补,别急着跑 configure:
| 组件 | 建议版本/形态 | 作用 | 常见问题 |
|---|---|---|---|
| Visual Studio 2019 | 16.x,含 C++ 桌面开发工作负载 | 提供 cl.exe、link.exe、nmake | 只装了 Build Tools 但没装 Windows SDK |
| Windows 10 SDK | 10.0.17763 及以上 | 头文件与库 | 多版本共存时 configure 选错 |
| Perl | 5.28+ 的独立发行版 | 构建脚本依赖 | 未加入 PATH |
| Python | 3.7/3.8 独立安装 | 部分模块脚本 | Store 别名 stub 干扰 |
| Qt 源码包 | qt-everywhere-src-5.15.16 | 编译输入 | 路径含空格或中文 |
| 磁盘空间 | 预留 30GB 以上 | 源码 + 中间产物 + 安装目录 | 中途空间不足导致链接失败 |
源码目录和构建目录必须分开,这是 Qt 官方推荐的 shadow build 方式。源码放D:\qt-src\qt-everywhere-src-5.15.16,构建目录另建D:\qt-build\5.15.16-msvc2019,安装目录再单独一个D:\Qt\5.15.16\msvc2019_64。三个目录都不要带空格和中文,nmake 和部分生成脚本对路径里的空格处理并不可靠,血泪经验是路径里出现一个空格,后面可能要多花半小时定位。
2.2 用 vcvarsall 固定编译环境
不要从开始菜单随便开一个“x64 Native Tools 命令提示符”就干活,那个环境的 SDK 版本取决于安装顺序。正确做法是显式调用 vcvarsall 并指定架构,把环境变量钉死:
:: 以管理员身份打开 cmd,进入 VS2019 安装目录下的 VC\Auxiliary\Build call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 -vcvars_ver=14.29这段调用的含义:x64指定目标架构为 64 位,-vcvars_ver=14.29把 MSVC 工具集锁定到 14.29 这一具体版本,避免机器上装了多个 VS 版本时被切到别的工具集。执行完可以用cl和where nmake验证,输出里应能看到 14.29 的版本号和 nmake 的绝对路径。如果cl提示找不到,说明工作负载没装全,回 VS Installer 补“使用 C++ 的桌面开发”。
环境固定后,再确认 Perl 和 Python:
perl -v python --version where perl where pythonwhere python如果第一条指向WindowsApps下的 stub,说明 Store 别名在抢路,去“应用执行别名”里把 python 和 python3 关掉,或者把独立安装的 Python 目录提到 PATH 最前面。这一步不做,configure 阶段会卡在一个看似无关的脚本报错上,翻车概率很高。
3. configure 参数怎么配:模块裁剪与许可选项的取舍
3.1 一份可直接抄的 configure 命令
Qt 5.15 的 configure 在 Windows 上实际是调用configure.bat,参数分几类:安装前缀、许可、模块开关、特性开关、第三方库路径。下面这份是我在 64 位桌面项目里常用的组合,裁掉了 WebEngine 和部分移动端模块,保留 Widgets、Network、Sql、Multimedia 这些桌面常用件:
cd /d D:\qt-build\5.15.16-msvc2019 D:\qt-src\qt-everywhere-src-5.15.16\configure.bat ^ -prefix D:\Qt\5.15.16\msvc2019_64 ^ -opensource -confirm-license ^ -platform win32-msvc ^ -debug-and-release ^ -nomake examples -nomake tests ^ -skip qtwebengine -skip qtwebview ^ -skip qtquick3d -skip qtquickcontrols ^ -opengl desktop ^ -mp逐项说明:-prefix是最终nmake install的落地目录,装完这个目录就是可被 Qt Creator 或 qmake 引用的 Qt 根目录;-opensource -confirm-license表示按开源许可构建并跳过交互确认,商用闭源场景要换成对应许可参数,这一点别抄错;-platform win32-msvc是 Windows 下的 mkspec 名,64 位也用它,架构由 vcvarsall 决定;-debug-and-release同时产出调试版和发布版库,调试版对定位崩溃很有用,代价是编译时间和磁盘翻倍;-nomake examples -nomake tests跳过示例和测试,能省下大量时间;-skip按模块名整块跳过,模块名要和源码顶层目录名一致,写错不会报错,只会静默不生效,这是最容易踩的坑之一;-opengl desktop用桌面 OpenGL 而非 ANGLE,桌面项目一般这样选;-mp开启多核编译。
如果项目需要 WebEngine,把-skip qtwebengine去掉,但要额外准备 Python 和 Node 环境,且编译时间会显著拉长,建议单独一轮构建,别和主库混在一起排错。
3.2 参数生效的验证与常见误配
configure 跑完会在构建目录生成config.summary,这是判断参数是否真正生效的唯一可靠依据,别只看屏幕滚动输出。重点核对三处:Build type是否为 debug-and-release、Build options里 skip 的模块是否确实不在列表、Qt Sql下的驱动是否包含你需要的(比如 SQLite 默认内置,MySQL 需要额外指定)。如果发现某个-skip没生效,先检查模块名拼写,再检查该模块是否被其他模块依赖而无法单独跳过。
另一个高频误配是-prefix指向了已存在的 Qt 安装目录。nmake install 会往里覆盖文件,如果那个目录是官方安装器装的 Qt,混装后 qmake 的 mkspec 和库版本可能对不上,出现“编译过了但运行崩”的玄学问题。我的习惯是 prefix 永远指向一个空目录或全新目录,装完再在 Qt Creator 里手动添加这个 Kit,不碰官方安装目录。
提示:configure 失败时不要急着重跑,先看构建目录下的
config.log,里面记录了每个探测项的原始命令和返回码,比屏幕输出详细得多。
4. nmake 编译与安装:从中间产物到可用 Kit
4.1 分阶段编译与并行度控制
configure 成功后,在同一个 cmd 窗口(环境变量还在)里执行 nmake。Qt 的顶层 Makefile 支持分模块编译,全量nmake会串起所有模块,出问题时不好定位。我一般先编核心模块验证工具链,再全量:
:: 先编 qtbase,验证工具链和 configure 是否正确 cd /d D:\qt-build\5.15.16-msvc2019 nmake module-qtbase :: 核心通过后,再全量编译 nmakemodule-qtbase是顶层 Makefile 提供的模块级目标,只编 qtbase 这一块,通常十几分钟能出结果,是验证环境是否健康的低成本手段。全量nmake的并行度由-mp在 configure 阶段决定,也可以在命令行用nmake /NOLOGO配合环境变量CL=/MP调整,但并行度过高在内存不足的机器上会触发链接器 OOM,表现为fatal error C1060或链接进程被系统杀掉。16GB 内存的机器建议并行度控制在 8 以内,32GB 以上可以放开。
编译过程中如果某个模块报错,nmake 默认会继续往下走,最后汇总一堆失败。想快速定位第一个错误,用nmake /K的反面——直接不加参数让它遇错即停,或者把输出重定向到日志再搜error:
nmake > build.log 2>&1 findstr /i "error" build.log重定向的好处是编译几十分钟后还能回看,屏幕缓冲区早就滚没了。日志里第一个error往往才是根因,后面的多是连锁失败。
4.2 安装与 Kit 注册
全量编译通过后执行安装:
nmake install这一步把编译产物按 prefix 布局复制到D:\Qt\5.15.16\msvc2019_64,包括 bin、lib、include、mkspecs、plugins。装完验证 qmake:
D:\Qt\5.15.16\msvc2019_64\bin\qmake.exe -v输出应显示QMake version 3.1和Using Qt version 5.15.16。然后在 Qt Creator 里“工具 → 选项 → Kits → Qt Versions”添加这个 qmake 路径,再新建一个 Kit,编译器选 VS2019 的 cl.exe,调试器选 cdb 或 VS 自带调试器。Kit 建好后用一个最小 Widgets 工程跑一遍 debug 构建,能断点进 Qt 源码(前提是编译时带了 debug 且保留了 pdb),才算真正可用。
注意:debug 版库的 pdb 文件在 install 后位于 lib 目录,如果后续要调试进 Qt 内部,别在清理磁盘时把 pdb 删了,删了就只能看汇编。
5. 编译期避坑清单:五条血泪记录
5.1 现象:configure 报 “Perl not found” 但明明装了
原因通常是 Perl 装了但没进 PATH,或者 PATH 里排在前面的某个目录有同名但不可执行的 perl。解决:where perl确认实际解析到的路径,把正确目录提到 PATH 最前,重开 cmd 再试。别在当前窗口改 PATH 后直接重跑,环境变量缓存可能没刷新。
5.2 现象:nmake 中途报 C1060 堆空间不足
原因是并行编译的 cl.exe 进程太多,内存被吃满。解决:降低并行度,或在 configure 时去掉-mp,改用nmake /NOLOGO单线程慢编。也可以只编需要的模块,用module-xxx目标逐个来,避免一次性拉起全部。
5.3 现象:编译通过但运行时报 “找不到 Qt5Core.dll”
原因是运行目录不在 PATH 里,或 Kit 配置的 Qt 版本路径不对。解决:开发期把D:\Qt\5.15.16\msvc2019_64\bin加进系统 PATH,发布期用 windeployqt 收集依赖。别把 bin 目录直接拷到 exe 旁边当部署方案,插件路径会乱。
5.4 现象:-skip qtwebengine写了但 WebEngine 还是被编了
原因是模块名拼写和源码目录名不一致,或者该模块被其他未跳过的模块依赖而被动拉起。解决:对照源码顶层目录名核对拼写,再看config.summary确认 skip 列表,必要时把依赖它的模块一起 skip。
5.5 现象:install 后 qmake 能跑,但 Creator 里新建工程链接失败
原因是 Kit 里选的编译器架构和 Qt 库架构不一致,比如 32 位 cl 配了 64 位库。解决:Kit 的编译器必须和 vcvarsall 里指定的架构一致,检查 cl 的dumpbin /headers输出确认目标机器类型,再回 Creator 改 Kit。
6. 增量重编与产物验证:把一次编译变成可复用流程
源码编译最烦的不是第一次,而是改了 configure 参数或打了补丁之后的重编。Qt 的构建系统支持增量,但前提是构建目录没被破坏。改 configure 参数的正确姿势是:在构建目录里重新跑一次 configure(它会复用已有中间产物),然后nmake,只有受影响的模块会重编。如果改了-prefix,install 会往新目录复制,旧目录残留需要手动清,别指望它自动迁移。
验证产物是否完整,我习惯跑一个脚本化的冒烟测试,而不是靠肉眼点 Creator:
import subprocess, os qmake = r"D:\Qt\5.15.16\msvc2019_64\bin\qmake.exe" env = os.environ.copy() env["PATH"] = r"D:\Qt\5.15.16\msvc2019_64\bin;" + env["PATH"] # 检查 qmake 版本与模块可用性 out = subprocess.check_output([qmake, "-query"], env=env, text=True) for key in ("QT_VERSION", "QT_INSTALL_PREFIX", "QT_INSTALL_LIBS"): line = [l for l in out.splitlines() if l.startswith(key)] print(line[0] if line else f"{key} MISSING") # 检查关键库文件是否存在 libs = ["Qt5Core", "Qt5Gui", "Qt5Widgets", "Qt5Network", "Qt5Sql"] libdir = r"D:\Qt\5.15.16\msvc2019_64\lib" for lib in libs: for suffix in (".lib", "d.lib"): p = os.path.join(libdir, lib + suffix) print(("OK " if os.path.exists(p) else "MISS"), p)这段脚本做两件事:用qmake -query读出安装后的实际路径和版本,确认 prefix 生效;再逐个检查关键库的 release 和 debug 版本是否都在。d.lib后缀是 debug 版库的命名约定,缺了说明-debug-and-release没真正生效。跑完这个脚本,再进 Creator 建最小工程,基本能排除“装是装了但不可用”的情况。
从那以后我每次编 Qt 都强制走一遍“vcvarsall 固定环境 → configure 看 config.summary → 先 module-qtbase 再全量 → install 后跑冒烟脚本”这条链路,中间任何一步跳过,后面大概率要用更多时间还债。希望帮到你。
本文还有配套的精品资源,点击获取