简介:QT 5.15.16编译包基于Windows 10与Visual Studio 2019环境构建,面向需要开发跨平台GUI应用的C++工程师,可同时产出32位与64位架构支持。整个压缩包共2000个文件,体积约753.36MB,其中包含1548个C++头文件,覆盖QtCore、QtGui、QtTest、QtCharts等核心模块声明,另有若干json与pri文件用于辅助配置;目录结构清晰,集成include、lib、plugins、bin四大模块。include内头文件提供函数、类与宏声明,是调用Qt框架的必要接口;lib内预编译库文件供链接器合并生成可执行程序;plugins提供可扩展插件,bin则包含部署调试工具。已有866人学习下载,适用于希望跳过源码编译、直接获得可用Qt库的开发者,能够在VS2019中快速链接并搭建应用程序,显著节省环境配置与依赖管理时间。
1. QT 5.15.16编译:win10+vs2019下自己动手值不值
Qt 5.15.16 这个版本号对做桌面开发的人并不陌生:5.15 是开源版里最后一个长期支持的稳定序列,5.15.16 则是这条分支上的修补版本,修了不少崩溃和兼容性问题。麻烦在于 5.15 之后,开源版想拿到官方现成的二进制安装包越来越难,很多团队直接选择自己编译。在 win10 上用 vs2019 工具链编一套 Qt 5.15.16,看着流程很长,真正走通后你会发现它就是 configure、nmake、install 三步循环,难点全在参数取舍和环境坑。下面按实际操作顺序来讲:先配环境,再给 configure 参数清单,接着并行编译和安装,最后列五个高频报错的排查路径。适合要换 Qt 版本、定制编译参数、被旧版 bug 卡住的开发者,新手照步骤也能完成。
2. 编译前规划:源码、工具链与磁盘空间一次配齐
编译 Qt 最怕的不是代码本身,而是环境里缺东西。许多人 configure 跑一半报错,回头一查是 PATH 里没有正确的工具链。所以这一章先把环境要求讲清楚,再动手。
2.1 源码包与vs2019工具链的匹配关系
Qt 官方发布的源码包分两类:一类是只包含核心库的 qtbase 单模块包,另一类是 qt-everywhere 整包。对 5.15.16 来说,既然要自己编译,建议直接拉整包,省得后面发现缺模块再回头补。整包会把 qtbase、qtdeclarative、qtmultimedia、qtwebengine 等模块全部包含,编译时用 -skip 参数按需切除即可。
单模块包的优点是体积小、下载快,缺点是模块间的依赖关系要自己梳理。比如你只要 QtGui,但它依赖 QtCore、QPA 平台插件等一堆基础组件,单包模式下你不得不逐个下载编译,折腾的时间比省下的下载量多得多。整包虽然第一步解压很慢,但 configure 会统一处理依赖,后续维护更省心。
工具链方面,vs2019 对应的编译器是 MSVC v142 工具集,Qt 官方 msvc2019 二进制版本用的就是这一套。自己编译时不需要刻意匹配某个内部版本号,只要确保 vs2019 安装了「使用 C++ 的桌面开发」工作负载,并且包含 MSVC 编译器、Windows SDK 和 CMake 工具。这三个组件默认会随工作负载装上,但如果你当初只装了 VS 的 IDE,就不能编译 Qt。
Windows SDK 的版本不需要精确对齐某一年份,最新的 Win10 SDK 配合 vs2019 的更新补丁就能通过 Qt 5.15 的编译检测。这里有个经验:与其纠结 SDK 的补丁号,不如把 vs2019 的组件更新到最新,因为 Qt 源码里的生成脚本对新版本头文件的兼容性通常更好,反过来和旧版 SDK 的坑更多。
2.2 用开发者命令行确认编译器、perl与python的可见性
编译 Qt 还需要三个外部程序:MSVC 编译器(cl.exe)、Perl、Python。Perl 主要用于生成翻译文件和构建脚本,Python 是部分模块辅助脚本的依赖。缺 Perl 或 Python,configure 会在检测阶段直接报错或默默跳过对应模块,所以提前确认它们都在 PATH 里。
检查方式就是打开 vs2019 自带的「x64 Native Tools Command Prompt for VS 2019」开发者命令行,依次执行下面几条:
where cl where nmake where perl where python如果 cl 和 nmake 能输出路径,说明工具链正确。perl 和 python 显示为「未找到」的话,需要先安装。安装 Perl 时勾选「Add Perl to the PATH」,Python 同样勾选加入 PATH。装完务必重开命令行再验证一次,因为 PATH 的修改不会自动同步到已打开的窗口。
这里有个常见坑:有人图省事从系统的应用商店装 Python,where python 能输出路径,但执行 python --version 却打开商店安装页。这种玄学问题很好躲,直接装官方 Python 安装包,选「Customize installation」,确认勾选「Add python.exe to Path」,装到 C:\Python39 这种纯英文路径即可,别用默认的用户目录。
2.3 源码目录与安装前缀的路径规划
Qt 编译对路径有两个硬性要求:全英文、无空格。源码目录和最终的安装目录都不能含中文或空格,否则生成脚本里的路径拼接容易出错,尤其是 WebEngine 这类模块,路径带空格会导致工具链解析失败,报错信息还很不直观。
我习惯把源码放在 C:\qt\src,安装前缀设在 C:\qt\5.15.16-msvc2019。两个目录分开有实际好处:configure 的 -prefix 参数指定最终安装位置,源码目录保持独立,意味着参数调整或重编时,删除源码目录不影响已安装版本;反过来,安装目录坏了也能重新走 install 步骤恢复,不用重新编译。
磁盘空间也要提前打算。完整编译整包、同时产出 debug 和 release 两套二进制,临时文件和最终产物的总量会明显超过直觉。我一般预留 30GB 以上,并且把 TMP、TEMP 环境变量指到空间最充裕的盘符:
set TMP=D:\tmp set TEMP=D:\tmp这么做是因为 configure 和编译过程会在临时目录里堆积大量中间文件。C 盘一旦写满,报错往往不是在写文件的那一刻,而是在后续的链接阶段,表现为各种「无法解析的外部符号」,很误导人。提前把临时目录改到大分区,等于给编译上了一道保险。设置完成后,在同一个命令行窗口里执行 echo %TEMP% 确认路径已生效,再开始 configure。
3. 配置与编译:configure参数取舍与并行构建实测
环境就绪就进入正题。configure.bat 决定编译哪些模块、按什么方式编译、装到哪里,参数选得合理,后面就是长时间等待;参数选得不对,编译到一半返工是常有的事。所以 configure 这步值得多花十分钟研究。
3.1 configure最小命令与8个常用开关
Qt 5.15 在 Windows 上通过 configure.bat 脚本进行配置。切换到源码根目录,执行 configure.bat -help 能看到全部参数,但几百个参数现场看会晕。实际编译我通常从下面这个最小命令开始:
cd C:\qt\src\qt-everywhere-src-5.15.16 configure.bat -prefix C:\qt\5.15.16-msvc2019 ^ -opensource -confirm-license ^ -debug-and-release ^ -nomake examples -nomake tests ^ -skip qtwebengine -skip qt3d -mp提示:源码目录名以你实际解压结果为准,不同发布批次可能略有差异。
逻辑说明:-prefix 指定安装目录,编译完成后所有头文件、库和插件都会拷到这里;-opensource 和 -confirm-license 组合表示接受开源许可,跳过交互确认;-debug-and-release 同时产出调试版和发布版,调试版文件名带 d 后缀,用于断点跟踪,发布版用于最终交付;-nomake examples -nomake tests 跳过示例和测试程序,能省下不少构建时间;-skip 后面跟模块名,用于剔除不需要的模块;-mp 让 MSVC 开启多进程编译。
参数说明里最值得花时间的是 -skip。qtwebengine 编译量极大、对外部环境最敏感,业务里不需要内嵌浏览器的话,第一次编译务必先跳过。qt3d 依赖 OpenGL 相关组件,项目没有 3D 需求也建议跳过。如果机器上同时装了多个 VS 版本,configure 可能探测到 vs2022 或 vs2017 的工具链,这时加一个 -platform win32-msvc 显式锁定平台,并确保当前打开的是 vs2019 的开发者命令行。
之后如果想把 WebEngine 补回来,不需要从头全量编译。重新运行 configure 时去掉 -skip qtwebengine,其他参数保持不变,然后进入 qtwebengine 子目录单独执行 jom 即可。这样能避免一上来就被 WebEngine 拖住整个流程。
3.2 jom与nmake:并行编译的取舍
configure 成功之后,终端会提示你执行 nmake。nmake 是 vs2019 自带的构建工具,单进程执行时,全量编译的等待时间会非常长。另一个选择是 jom,Qt 官方为 Windows 提供的并行构建工具,本质是对 nmake 的兼容替代。
把 jom.exe 放到任意 PATH 目录(比如 C:\qt\tools),然后在源码根目录执行:
jom jom installjom 会自动检测 CPU 核数并并行调度,不需要手动传线程数。8 核以上的机器,体感差别非常明显。第一次全量编译建议用 jom,后续单独编某个模块也统一用它,习惯保持一致能少踩不少坑。
个别情况下,第三方模块生成的 Makefile 对语法要求更严格,jom 可能解析不过去。此时换回 nmake 单进程编译该模块即可,不要死磕。这属于正常现象,不是工具本身有问题。
jom 的并行度也不是越大越好。内存小于 16GB 的机器上,并行线程过多会频繁发生页面交换,编译速度反而下降。确有此情况时,给 jom 加 -j 4 这类手动限制参数,比默认全核跑更稳。
3.3 编译产物检查:从lib到dll的目录结构
编译结束后,jom install 会把产物统一拷贝到 -prefix 指定的目录。先看目录结构再跑任何验证程序,能挡住大半问题。常见布局:bin 放动态库和可执行文件,lib 放导入库,include 放头文件,plugins 放插件,mkspecs 放 qmake 的配置数据。
dir C:\qt\5.15.16-msvc2019\bin\Qt5Core.dll dir C:\qt\5.15.16-msvc2019\lib\Qt5Core.lib dir C:\qt\5.15.16-msvc2019\include\QtCore逐个模块确认需要的 dll 都在,比直接跑一个 hello world 更可靠。因为某些模块即使编译失败,configure 也可能不报错,而是生成一个空的导入库糊弄过去。另外用 qmake 自检一下安装前缀:
C:\qt\5.15.16-msvc2019\bin\qmake.exe -query QT_INSTALL_PREFIX输出的路径应该就是 -prefix 指定的目录。如果输出的是源码目录而不是安装目录,说明 install 阶段没有成功拷贝,需要检查 install 时使用的命令行窗口权限或杀毒软件拦截。
bin 目录下 dll 是否带 d 后缀,是快速判断 debug/release 是否同时产出的标志。只编 release 时看到的都是 Qt5Core.dll;debug 和 release 都编了,才会同时出现 Qt5Core.dll 与 Qt5Cored.dll。
4. 编译避坑:5个高频报错的排查路径
编译 Qt 时的报错信息往往又长又绕,表象五花八门,但高频问题其实集中在少数几个根因上。下面按「现象 → 原因 → 解决」列五条,都是实际编译中反复遇到的。
4.1 configure阶段提示找不到Perl
现象:configure 跑到中途报 Perl not found,或者提示 perl 不是内部或外部命令,配置流程直接中断。
原因:Perl 没有安装,或安装时没有加入 PATH。Qt 的构建流程在 configure 阶段就会调用 Perl 生成本地化文件,缺了它不会自动跳过,而是直接中断。
解决:到 Perl 官网下载 Windows 版安装包,安装时勾选添加到 PATH。装完重开开发者命令行,先执行 where perl 确认能找到,再重新跑 configure.bat。注意 PATH 修改不会即时生效,必须重新打开命令行窗口。
4.2 WebEngine模块编译中途失败或耗时过长
现象:编译 qtwebengine 子目录时,进度条卡住一两个小时,或出现 ninja: error: missing and unknown target 后停止。
原因:WebEngine 内部使用 Chromium 的构建体系,对工具链和内存要求都很高,Python 缺失、目录权限不足、临时空间不够都会在中途失败,报错反而不直接。
解决:第一次全量编译时用 -skip qtwebengine 跳过,等核心库稳定集成后再单独补编。补编前确保 Python 可执行、临时目录空间充足。如果业务完全不需要内嵌网页,建议永久跳过,省下的时间足够再编一轮完整 Qt。
4.3 源码路径含中文空格导致乱码
现象:configure 顺利通过,但编译到某个模块时报错无法打开包含文件,路径中出现乱码,或生成的文件名带问号。
原因:源码目录或安装前缀含中文、空格字符。Qt 的部分生成脚本不做路径转义,遇到非 ASCII 字符时就拼接出错误路径。
解决:把源码解压到纯英文路径,比如 C:\qt\src\qt-everywhere-src-5.15.16。已经踩进去的话,删掉旧目录重新解压,不要尝试在原位置改名绕过,因为大量相对路径已经写在生成的 Makefile 里,改名会产生新的不一致。
4.4 磁盘被临时文件吃满的隐性信号
现象:编译到一半出现各种 undefined reference,或链接器报错提示磁盘空间不足,但检查 C 盘剩余空间还有几个 GB。
原因:configure 使用的临时目录由 TEMP 环境变量决定。如果 TEMP 指向 C 盘而 C 盘空间不足,中间文件写不进去,最终报错却常常表现为「无法解析的外部符号」,和代码本身毫无关系。
解决:编译前把 TMP、TEMP 指向大分区盘符,并在 configure 之前执行 echo %TEMP% 确认生效。这条规则同样适用于 jom,它的缓存目录也受 TEMP 影响。
4.5 杀毒软件静默隔离生成的exe/dll
现象:jom install 正常执行完,但 bin 目录下部分 dll 不存在,或 Qt5Core.dll 在但程序运行时提示找不到动态库。
原因:杀毒软件实时防护把编译过程中生成的未签名 exe/dll 当作可疑文件隔离了。Windows 自带的安全中心有时也会对 MSVC 输出误报。
解决:把源码目录、安装前缀、临时目录加入杀毒软件排除列表。已经发生隔离就先去隔离区恢复文件,再重跑 jom install 重新拷贝。最稳妥的方案是编译期间临时关闭实时防护,编译完再打开。前提是你确认源码来自官方渠道,安全性有保障。
5. 集成验证:把编译好的QT挂进vs2019工程
编译只是第一步,让 vs2019 真正认得出、跑得来,才算闭环。这一章把验证路径串起来,建议按顺序走一遍,别跳过。
5.1 在Qt VS Tools里配置编译器前缀
vs2019 里安装好「Qt Visual Studio Tools」扩展后,菜单栏会出现 Qt VS Tools。进入 Qt VS Tools → Qt Versions,新增一条配置:Version 名称填 5.15.16-msvc2019,Path 指向安装前缀 C:\qt\5.15.16-msvc2019。扩展会自动读取 qmake.exe 的版本信息,能正确显示版本号说明目录结构没问题。
这里有个细节:扩展读取的是 mkspecs 目录的信息,如果 configure 时用了自定义 -platform,扩展可能识别不到。此时直接看 C:\qt\5.15.16-msvc2019\mkspecs\qconfig.pri 里的配置即可,不必重编。
注意 vs2019 里装 Qt VS Tools 扩展时,选与当前 VS 匹配的版本,不要装最新的跨 VS 版本,否则扩展可能找不到 v142 工具集。扩展装完需要重启 vs2019 才能生效。
5.2 用CMake独立工程验证编译与运行
扩展配置好之后,最直接的验证是建一个最小 CMake 工程,不依赖扩展,直接用编译好的 Qt 库。这样能确认编译产物本身自洽,排除扩展配置的干扰。
工程放两个文件:
cmake_minimum_required(VERSION 3.16) project(helloqt LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_PREFIX_PATH "C:/qt/5.15.16-msvc2019") find_package(Qt5 COMPONENTS Core Widgets REQUIRED) add_executable(helloqt main.cpp) target_link_libraries(helloqt Qt5::Core Qt5::Widgets)main.cpp 内容:
#include <QApplication> #include <QLabel> int main(int argc, char** argv) { QApplication app(argc, argv); QLabel label("Qt 5.15.16 compiled with vs2019"); label.show(); return app.exec(); }在开发者命令行里执行构建:
cmake -S . -B build -G "Visual Studio 16 2019" -A x64 cmake --build build --config Release逻辑说明:CMAKE_PREFIX_PATH 让 find_package 能定位到 Qt5 的 CMake 配置目录,路径里的斜杠方向按 CMake 习惯写;-G 指定生成 vs2019 工程,-A x64 指定 64 位目标。能成功编译出窗口,说明 Qt5Core、Qt5Widgets 模块可用。
构建时注意一个点:这里只验证了 Release 模式。如果 configure 阶段只编译了 debug 库,而这里用 --config Release 构建,链接会失败,提示无法打开 Qt5Core.lib。应对方式是让构建配置和编译库的模式保持一致,或者在 CMake 工程里直接看 CMAKE_BUILD_TYPE 的值。用 CMake 工程验证的好处是零扩展依赖,能真实反映 Qt 库本身状态,若这一步通过,基本可以认定编译产物可用。
5.3 排查运行时找不到dll的三种常见情况
编译链接都通过,运行时却弹窗提示缺少 Qt5Core.dll,新手最容易在这里懵。原因基本有三种:PATH 环境变量没包含 bin 目录、dll 没有拷贝到可执行文件旁、debug/release 库混用。
最省事的方式是用 windeployqt 自动部署依赖:
C:\qt\5.15.16-msvc2019\bin\windeployqt.exe build\Release\helloqt.exe这个工具会把依赖的 dll、插件、qml 模块都拷到 exe 旁边。拷贝完仍然报缺 dll,用 dumpbin 查看 exe 的导入表,确认它依赖的是哪个版本:
dumpbin /dependents build\Release\helloqt.exe输出里会列出 Qt5Core.dll 还是 Qt5Cored.dll。如果 exe 依赖的是 Qt5Cored.dll 而 release 目录里拷进来的是 Qt5Core.dll,就是 debug/release 混用。把带 d 后缀的 dll 连同一套插件目录整体拷贝过去,问题就解决了。
另一个容易被忽略的情况是 plugins 目录缺失。Qt 的 qwindows.dll 平台插件不在 bin 而在 plugins\platforms 下,windeployqt 会自动处理,手动部署时很容易漏掉。遇到跑起来黑窗口或者窗口闪退,先检查 plugins 目录里有没有 platforms,而不是去翻代码。
6. 二次编译提速:按需裁剪与增量构建的小技巧
编译过一次之后,重编时你会想把等待时间压下来。以下三个技巧是我反复验证过、最值得落地的。
第一,用 -skip 按需裁剪模块。qtwebengine、qtmultimedia、qtlocation 这类重型模块,业务用不到就从 configure 参数里移掉。裁剪列表控制在小幅范围内,因为 Qt 模块之间存在交叉依赖,裁过头反而要在运行时缺模块,回头再补更费劲。
第二,只保留 release 版本。大多数逻辑问题可以靠日志和断言定位,真正需要断点跟踪时再单独编一次 debug 构建。这个取舍能把一次全量编译的时间压掉近一半:
configure.bat -prefix C:\qt\5.15.16-msvc2019 ^ -release -opensource -confirm-license ^ -nomake examples -nomake tests ^ -skip qtwebengine -mp第三,增量构建时只编改动过的模块。全量失败后不需要重新跑 configure,回到源码根目录,对具体模块执行 jom:
cd C:\qt\src\qt-everywhere-src-5.15.16 jom module-qtbase这个命令只编译 qtbase 模块及其依赖,跳过其他模块,速度能快一个量级。代价是模块间头文件版本不一致时可能漏编,所以每次补完模块后,我会回到第 5 章的 CMake 工程做一遍干净验证,再投入业务。
这个流程里我最看重的是第一次花二十分钟把环境固定下来,后面每次重编都只是重复劳动,不再折腾环境。后来换别的 Qt 版本,我也沿用同一套目录和环境配置,基本没再翻过车。希望帮到你。
本文还有配套的精品资源,点击获取