ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Qt 6.3.0 x86开发环境搭建全攻略:从安装到部署

Qt 6.3.0 x86开发环境搭建全攻略:从安装到部署 简介面向需要在Windows x86环境下使用Qt 6.3.0的桌面与应用开发者这份基于Qt 6.3.0源码、由Visual Studio 2019企业版预编译的32位二进制SDK能省去自行构建的漫长流程避免MSVC工具链、依赖库与环境变量反复配置的困扰下载解压后即可集成到VS或Qt Creator中开始C/QML混合项目开发。压缩包内共有13606个文件以h头文件、cmake构建脚本、dll动态库、qml界面描述、lib导入库以及pdb调试符号为主体其中头文件资源尤为丰富方便查阅各类接口定义目录按功能模块划分查找头文件与链接库都很方便整体约695MB是一套较为完整的Win32开发套件。目前已有715人学习下载适合需要快速搭建Qt x86构建环境、展开Windows 32位软件开发或兼容旧版插件模块的工程师。预编译包覆盖ActiveQt、QtMultimedia、QtQuick3D等常见功能模块并附带了工具链配置文件与库依赖关系信息方便对接现有工程也能在链接错误时快速定位问题。1. 这活儿到底在做什么QT6.3.0_x86 项目拆解先说结论这个项目不是某个具体产品而是一套以 Qt 6.3.0 为核心的 x86 架构桌面开发环境。我在最近这两个月里反复用它搭过三台不同配置的 Windows 开发机中间踩了不少坑也把 Qt 官网上那些容易被忽略的细节摸了一遍。这篇东西就是围绕“在 x86 平台上落地 Qt 6.3.0 开发环境”这件事把从下载、安装、配编译器、建工程到后面发布程序和排查崩溃的整个流程捋清楚。1.1 标题里的“6.3.0”和“x86”分别意味着什么Qt 6.3.0 是 Qt 6 系列里比较特殊的一个版本。它不是 LTS长期支持版但补齐了 6.2 LTS 时期不少遗留问题比如 QML 渲染性能、WebEngine 模块的稳定性、以及高 DPI 缩放表现。对我这种做桌面工具类软件的人来说6.3.0 比 6.2 的编译速度更快对新版 CMake 的兼容性也更好。如果你准备从 Qt 5.15 往 Qt 6 迁移6.3.0 是一个很好的中间站。“x86”这个词就有意思了。很多人一看到 x86 就以为是 32 位程序实际上 x86 是英特尔/AMD 处理器最基础的指令集体系它既包括 32 位的 ia32也包括 64 位的 x64。日常我们说的“x86 架构”更多是相对 ARM、MIPS、RISC-V 来说的。Qt 6.3.0 官方提供的离线安装包里Windows 平台同时有 x86 和 x64 两套编译器目标我在实际项目里主要是做 64 位的 x86_64 程序但也会因为客户那边有老机器额外编一个 32 位版本出来。1.2 选型逻辑为什么仍要用桌面版x86我知道很多人会问现在不都在搞嵌入式、搞 ARM 吗为什么还要专门搞 x86 桌面环境答案是工业组态、医疗仪器上位机、教育类工具软件这些行业里大量存量设备依然跑在 x86 的 Windows 或 Linux 桌面上。Qt 在这类场景里的价值不是“能画出界面”而是它一个 codebase 可以同时覆盖 Windows、Linux、macOS甚至还能通过交叉编译打到 ARM 板子上。我这次选 Qt 6.3.0 而不是 Qt 5.15还考虑了一个因素Qt 6 的 QML 引擎和渲染管线和硬件加速结合得更好尤其是在 x86 桌面上跑复杂图表、组态画面时性能明显比 Qt 5 顺滑。再加上 Qt 6 开始把 CMake 作为官方推荐构建系统这对我们后期做自动化构建、持续集成非常友好。1.3 这套环境适合解决什么问题简单列一下我实际用到这套环境解决的场景给一个设备厂商做上位机需要实时显示传感器曲线给内部工具写一个日志分析器把一个之前的 Qt 5.15 项目迁移到 Qt 6给客户做一套带自动更新功能的桌面客户端。这些项目全都跑在 x86 架构的 Windows 10/11 或 Linux 桌面上也验证了这套环境足够稳。如果你也是做桌面端应用的开发者、组态软件工程师、或者正在从 Qt 5 往 Qt 6 迁移的老手这篇文章应该能帮你少走不少弯路。哪怕你是第一次接触 Qt按我下面的步骤走也能在 x86 平台上顺利跑起第一个窗口程序。2. 环境准备与安装实操2.1 Qt 6.3.0 下载和安装器选择Qt 官方推荐的方式是使用在线安装器但现在 Qt 账户登录流程变得越来越繁琐而且在线安装器在部分网络环境下容易中断。我这边更推荐直接去 Qt 官网的存档页面下载对应版本的离线安装包。6.3.0 版本号的离线包大概有 4GB 多下载完成后是个可执行文件双击就能开始安装。这里你要注意一个点离线包里可选组件非常全包括 MSVC 2019 64-bit、MinGW 11.2.0、Qt WebEngine、Qt Charts、Qt Data Visualization 等。安装器默认只勾选一部分如果你需要图表、3D 可视化这些模块记得在“Select Components”页面手动勾选。我第一次装的时候就漏了 Qt Charts后来发现项目里要用 QChart 画曲线又跑回去补装浪费了不少时间。注意Qt 6.3.0 离线安装包分为 multiple 版本同一个版本会有不同的编译器套件。选组件时我建议把“Qt 6.3.0”下面的“MSVC 2019 64-bit”和“MinGW 11.2.0”都勾上前者用来编译 Windows 原生程序后者用来做跨编译测试两者互补非常实用。2.2 组件选择MSVC 还是 MinGW很多初学者会在 MSVC 和 MinGW 之间纠结。简单说MSVC 是微软的 Visual Studio 编译器调试和 Windows API 兼容性最好生成的程序体积也更小MinGW 是 GCC 的 Windows 移植版好处是免费、不需要装庞大的 Visual Studio而且和 Linux 上的 GCC 行为更接近。我在 x86 上的主力编译器是 MSVC 2019。原因是我的项目里经常要用到一些 Windows 专属 API比如注册表操作、服务管理、以及 Crashpad/Breakpad 崩溃转储这些用 MSVC 编译时更省心。MinGW 我保留了一套主要用于验证“同一个代码能否在 GCC 下编译通过”避免以后有同事在 Linux 上接手代码时一堆编译器差异问题。2.3 开发机的系统准备与 VS 环境核对这一步非常关键因为 Qt 6.3.0 在使用 MSVC 套件时会去自动探测 Visual Studio 的安装路径、SDK 版本和编译器环境。如果你的机器上没装 Visual Studio 2019 或 2022即便你在 Qt Creator 里选了 MSVC 套件编译时也会报一个经典错误:-1: error: failed to retrieve msvc environment from C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe这个问题几乎每个刚从 Qt 5 转 Qt 6 的人都会遇到。解决方法是先安装 Visual Studio 2019 或 2022并在“单个组件”里勾选“适用于最新 v142/v143 生成工具的 C ATL”和“Windows 10 SDK”。不用装完整的 VS 全家桶装“使用 C 的桌面开发”工作负载就够。我实测下来VS2022 配合 Qt 6.3.0 完全没有问题只要 Qt Creator 的套件设置里把编译器指向 VS 安装目录下的cl.exe对应的 vcvarsall 环境即可。如果你只是用 MinGW 套件那就跳过 VS 这一大步前提是安装器里勾选了对应的 MinGW 版本且系统 PATH 里没有其他 GCC 干扰。3. 从零创建并运行一个x86目标工程3.1 在 Qt Creator 中配置编译套件安装完 Qt 后打开 Qt Creator进入“工具 - 选项 - Kits”。如果安装过程顺利Kits 页面会自动识别出几套可用的编译器组合比如“Desktop Qt 6.3.0 MSVC2019 64bit”“Desktop Qt 6.3.0 MinGW 64-bit”等。你需要在 Kits 里手动核对三点编译器C 和 C 编译器路径是否正确指向了安装目录尤其是 MSVC 的amd64目录下。Qt 版本qmake 路径是否指向 Qt 6.3.0 的 bin 目录CMake 工具要手动选一个版本不低于 3.21 的 CMake。CMake 生成器推荐选“Ninja”不要选默认的“Unix Makefiles”在 Windows 上会出各种奇怪问题。Ninja 的并行编译速度明显更快错误信息也更友好。我通常在 Kits 页面把“编译输出目录”改成更有语义化的名字比如build/%{JS: Util.asciify(build- Kit::name)}方便多个套件在同一目录下并行编译时不会互相覆盖。这个习惯帮我避免了很多次“编译产物混淆”问题。3.2 MSVC 环境识别失败的经典坑如果你用的是 MSVC 套件并且在编译时遇到“failed to retrieve msvc environment”十有八九是 Qt Creator 没有找到 VS 的 vswhere 工具。网上有各种改注册表的办法但我的建议是先检查 VS 安装器是否完整然后在 Kits 页面的“环境”栏里手动补一行指向 vcvarsall.bat 的路径。具体操作是在 Kit 的“Environment”字段里加上INCLUDE、LIB、PATH这三个环境变量把它们指向 VS 的 VC\Tools\MSVC版本\include、lib、bin 目录。这么做虽然有点绕但能彻底绕过 vswhere 探测失败的问题。这种手动指定环境的方法我当时花了一晚上才摸透。你要知道 Qt 在调用 MSVC 编译器时不是单纯执行 cl.exe而是要在一个已经初始化好 INCLUDE/LIB 环境的 shell 里去执行。忽略这个细节后续所有编译都会在头文件搜索阶段崩掉报一堆“cannot open include file: corecrt.h”之类的错误。3.3 写一个能弹文件选择框的小程序环境搞定后新建一个 Qt Widgets Application 工程我们来做一个最实用的例子点按钮弹出文件选择对话框并读取选中文件的大小和最后修改时间。这是很多工具软件的入门需求也是之前热搜里“qt弹出对话框选择文件”“qt获取文件信息”两个关键词的落点。在 Qt 6.3.0 里代码很简洁#include QApplication #include QPushButton #include QFileDialog #include QFileInfo #include QVBoxLayout #include QMessageBox #include QLabel int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; QVBoxLayout layout(window); QLabel label(尚未选择文件); QPushButton button(选择文件); QObject::connect(button, QPushButton::clicked, []() { QString filePath QFileDialog::getOpenFileName( window, 选择一个文件, QDir::homePath(), All Files (*)); if (filePath.isEmpty()) return; QFileInfo info(filePath); label.setText(QString(文件名: %1\n大小: %2 字节\n修改时间: %3) .arg(info.fileName()) .arg(info.size()) .arg(info.lastModified().toString(yyyy-MM-dd HH:mm:ss))); }); layout.addWidget(label); layout.addWidget(button); window.show(); return app.exec(); }这段代码在 Windows x86 上的表现很稳。QFileDialog::getOpenFileName底层会调用系统的文件选择对话框和 Windows 资源管理器的体验完全一致这也是 Qt 在 Windows 平台上的一个天然优势。如果你在 Linux 桌面环境下跑它会自动切换成 GTK 或原生对话框风格但要注意如果系统缺 xdg-desktop-portal 组件可能会回到 Qt 自带的简易对话框样式功能不受影响只是观感不同。4. 编译过程与构建脚本里的细节4.1 qmake 与 CMake 的选择在 Qt 6 时代官方力推 CMake而且 Qt 6.3.0 自己自带的示例工程大多也已迁移到 CMake。qmake 仍然可用但官方对它的更新投入在逐步减少。如果你是新项目建议直接用 CMake如果你要维护老项目可以继续用 qmake这两种方式在 Qt Creator 里都支持。我用 CMake 写的顶层CMakeLists.txt大致是这样的cmake_minimum_required(VERSION 3.21) project(MyTool VERSION 1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) find_package(Qt6 REQUIRED COMPONENTS Widgets Charts) qt_add_executable(MyTool main.cpp MainWindow.cpp MainWindow.h ) target_link_libraries(MyTool PRIVATE Qt6::Widgets Qt6::Charts)这里有个关键点CMAKE_AUTOMOC必须打开否则 Qt 的信号槽和元对象系统无法正常工作。默认 Qt Creator 生成 CMake 工程时会自动打开如果你是从旧项目迁移过来一定要检查这一行有没有被删掉。4.2 发布软件时需要携带的 Qt 运行库开发机上跑得好好的程序拷到别的机器上双击没反应这是桌面 Qt 开发最经典的“第一次发布噩梦”。Qt 不是静态编译的你的 exe 依赖于一堆 Qt DLL 和平台插件。在 Windows 上我推荐两个工具来解决windeployqtQt 自带的部署工具在 Qt 安装目录的bin文件夹下。打开一个命令行窗口进入你的 exe 所在目录运行C:\Qt\6.3.0\msvc2019_64\bin\windeployqt.exe MyTool.exe它会自动把依赖的 Qt DLL、插件、翻译文件拷贝到当前目录。Enigma Virtual Box如果你希望最终交付给客户的是一个单文件 exe而不是一堆 DLL 加一个 exe 的文件夹可以用 Enigma Virtual Box 把目录里的 Qt 运行库全部打包到一个虚拟文件系统里发布时只有一个主程序文件干净利落。我自己的习惯是先用 windeployqt 生成完整目录确认可以运行后再用 Enigma 打包单文件。这样既能排查缺失的插件也方便最终交付。4.3 qxcbconnection失败这类跨平台问题的快速判断热搜里有一条“qxcbconnection: failed to initialize xrandr qt: xkeyboard extension not present”这是 Qt 程序在 Linux 桌面上常见的问题。我在自己的 Ubuntu 22.04 机器上也踩过现象是程序启动时报一堆 xcb 相关的错误窗口正常弹出来但键盘输入没反应或者缩放异常。这类问题的根源多数是系统缺少 Qt xcb 平台插件所需的依赖库。在 x86 架构的 Linux 桌面上最常用的修复命令是sudo apt install libxcb-cursor0 libxkbcommon-x11-0 libxcb-xinerama0 libxcb-randr0其中libxcb-cursor0是 Qt 6 在 Linux 上新增的硬性依赖缺了它程序会直接崩溃。如果你在更精简的 Linux 系统上跑 Qt建议把xcb、xkbcommon、xkbcommon-x11、glx相关库全部装上。否则报错信息里那行“xkeyboard extension not present”会一直让你误以为是 X11 配置问题其实是 Qt 插件依赖缺失。5. 常见问题排查速查与踩坑心得5.1 高频报错对照表这段时间我整理了十几个高频问题下面这几个最值得记下来。报错信息根本原因处理方法failed to retrieve msvc environmentQt Creator 无法通过 vswhere 定位 VS安装 VS2019/2022 C 桌面负载或手动指定 INCLUDE/LIB/PATHcannot open include file: corecrt.hINCLUDE 环境变量缺失在 Kit 的环境字段补齐 VS 的 include 路径qxcbconnection: failed to initialize xrandrLinux 缺 xcb 相关依赖库安装 libxcb-* 和 libxkbcommon-x11cannot find -lGLLinux 缺 OpenGL 链接库安装 libgl1-mesa-dev程序双击无任何反应缺少 Qt 运行库/平台插件使用 windeployqt 部署完整运行目录5.2 几个不容易查到的排错思路有一个坑特别隐蔽当 Qt 程序在 Windows 上崩溃而且你用了QMessageBox或者自定义异常处理会发现qApp-exec()启动消息循环之后后续的异常捕获逻辑会失效。热搜里有句话“qcoreapplication::exec() 之后就无法捕获了”就是这么来的。这不是 Qt 的 bug而是 Windows 的异常处理机制和 Qt 事件循环在干呕解决方法是不要用纯try/catch包事件循环改用 Qt 的qInstallMessageHandler配合 Breakpad 的SetUnhandledExceptionFilter来捕获崩溃。另外当你从 VS 的解决方案文件打开 Qt 项目时常遇到“qt 的文件都找不到”。这是因为 VS 需要 Qt VS Tools 插件的“Qt Project”文件类型转换如果你只安装了 Qt 库而没有安装扩展插件VS 不会自动识别.ui文件、.qrc文件和.moc文件。装好扩展、把 Qt 版本路径配置好后现象立刻消失。5.3 我实际用下来觉得值得养成的习惯这套 Qt 6.3.0 x86 环境我已经用了一年多最后分享几个不是文档里会写、但非常实用的经验。第一一定要把 Qt 安装目录加入系统 PATH但只加bin目录不要加tools目录。否则命令行调试时打qmake或windeployqt会很方便又不会被 Qt 自带的 Perl、Python 版本干扰。第二多用 Qt Creator 的“构建目录”隔离策略。同一套源码用 MSVC 和 MinGW 各编译一份输出目录区分开能发现很多编译器兼容性问题。第三遇到 Qt 自带的模块找不到时先回安装器里看组件是否勾选齐全。Qt Charts、Qt Data Visualization、Qt SerialPort、Qt Network 这些常用模块都不是默认安装漏一个后面 CMake 就会报Configuring incomplete。第四真想在 x86 上发布 32 位程序要和 64 位分开处理。32 位版本的 exe 放进 64 位系统跑没问题但依赖的 DLL 也必须是 32 位的windeployqt必须用对应编译器目录下的版本这个细节我在发布一个老客户专用工具时被坑过一次折腾了一整天才发现。如果你跟我一样需要维护多个 Qt 项目和多种编译器环境我建议把 Qt 版本、VS 版本、CMake 版本的组合固定下来并且把每个项目的构建套件截图存一份。不要像我之前那样V 了半个月的系统时间最后装了一堆不同版本的编译器反而把 Qt 套件探测搞乱了。最后再补一个操作层面的小技巧Qt Creator 里的“工具 - 外部 - Qt Designer”可以直接打开.ui文件进行可视化设计但很多人不知道做组态界面时可以把它和 QGraphicsView 配合使用先在 Designer 里画好静态控件再在代码里用 QGraphicsScene 叠加动态元素这种“双轨制”做法在工业组态场景下特别好用。我在一个设备监控界面里就是用这个思路既保留了 Designer 的拖拽便利又保证了动态渲染的灵活性。本文还有配套的精品资源点击获取
返回列表