1. 为什么“Qt 下载安装”这件事,值得花一整篇干货来写?
很多人看到“Qt 下载安装”这五个字,第一反应是:“不就是去官网点几下、解压、配个环境变量?5分钟搞定,还用写文章?”——我完全理解这种想法。我自己第一次装 Qt 时,也是这么想的,结果在某高校实验室带一个图像处理课程项目时,被6个学生同时卡在“安装完成但qmake找不到”“Creator打不开”“CMakeLists.txt报错Unknown CMake command ‘qt_add_executable’”这类问题上,整整折腾了大半天。后来我才意识到:Qt 的安装从来不是“下载→双击→完成”的线性流程,而是一场涉及操作系统底层机制、构建系统演进逻辑、IDE与工具链耦合关系的微型系统工程。
核心关键词——Qt、下载、安装——表面看是操作动作,实则背后横跨三大矛盾:
- Qt 版本生态分裂:Qt 5.15 是最后一个免费商用的LTS版本,Qt 6.x 全面转向C++17+、模块重构、CMake原生支持,但大量教程、开源项目、教材仍基于Qt 5;
- 安装方式三足鼎立:在线安装器(Online Installer)动态拉取组件,离线包(Offline Package)体积庞大但免网络依赖,源码编译(Source Build)自由度最高却极易因系统库版本不匹配失败;
- 开发环境隐性依赖复杂:Windows 上 MinGW/MSVC 工具链必须严格匹配 Qt 编译版本;macOS 上 Xcode 命令行工具、SDK 版本、签名权限层层嵌套;Linux 上 glibc 版本、libxcb、libglvnd 等图形栈组件缺失直接导致启动黑屏。
这不是“会不会装”的问题,而是“装对没装对、能不能长期稳定用下去”的问题。我见过太多人装完 Qt Creator,跑通第一个 Hello World,三个月后加个 QWebEngineView 就崩溃,查日志发现是 Qt WebEngine 模块根本没选中安装;也见过团队用 Qt 6.5.3 开发,CI 流水线却用 Qt 6.4.2 构建,因为 Docker 镜像里写的还是旧版本——这些都不是代码问题,全是安装阶段埋下的雷。
所以这篇内容,不讲“点击下一步”,只讲你真正需要知道的决策点、参数含义、版本对应关系、验证方法和长期维护逻辑。适合三类人:刚接触 Qt 的新手(避开90%的入门坑)、正在升级项目的中级开发者(搞清Qt5→Qt6迁移的安装侧关键变化)、负责搭建统一开发环境的团队技术负责人(掌握可复现、可审计、可CI集成的安装方案)。接下来所有内容,全部来自我过去十年在嵌入式GUI、工业HMI、跨平台桌面应用等真实项目中的安装实践沉淀,每一个参数、每一条命令、每一个截图背后的逻辑,都经受过至少5个不同操作系统版本、3种构建场景的交叉验证。
2. Qt 安装方案全景图:三种路径的本质差异与适用场景
Qt 官方提供三种主流安装方式:在线安装器(Online Installer)、离线安装包(Offline Package)、源码编译(Build from Source)。很多教程把它们并列介绍,但实际使用中,选择哪一种,本质是在“可控性”“确定性”“维护成本”三个维度上做取舍。下面我用一张表说清它们的核心差异,再逐条解释为什么这些差异会直接影响你的项目生命周期。
| 维度 | 在线安装器(Online Installer) | 离线安装包(Offline Package) | 源码编译(Build from Source) |
|---|---|---|---|
| 安装耗时 | 首次下载慢(500MB~2GB),后续增量更新快 | 解压快(10秒内),但包体巨大(Windows x64 全量包超3GB) | 极慢(Linux x86_64 全量编译约2.5小时,需16GB内存) |
| 版本确定性 | ★★★☆☆(服务器端版本可能更新,本地缓存可能失效) | ★★★★★(ISO镜像哈希值固定,版本绝对锁定) | ★★★★★(Git commit ID 或 tar.gz SHA256 可精确追溯) |
| 组件可控性 | ★★★★☆(勾选模块灵活,但部分模块如 Qt WebEngine 依赖外部构建) | ★★★★☆(同在线版,但无法动态更新新发布的补丁) | ★★★★★(可禁用任意模块,自定义编译选项如 -no-opengl、-static) |
| 系统兼容性保障 | ★★☆☆☆(自动检测系统,但对老旧Linux发行版支持弱) | ★★★☆☆(预编译二进制,仅适配官方标注的系统版本) | ★★★★★(可针对目标系统精准配置,如交叉编译ARM嵌入式Qt) |
| 长期维护成本 | ★★☆☆☆(需定期检查更新,多人环境易出现版本漂移) | ★★★★☆(一次安装,长期稳定,但升级需重新下载新包) | ★★★☆☆(升级需重新编译,但可自动化脚本固化流程) |
2.1 在线安装器:最常用,也最容易“踩坑”的选择
在线安装器是 Qt 官网首页默认推荐的方式,Windows/macOS/Linux 通用,图标是个蓝色地球。它最大的优势是“傻瓜化”——你只需注册一个免费账号(邮箱即可),登录后选择版本、组件、安装路径,点几下就完事。但它的“智能”恰恰是隐患来源。
比如,当你在 Windows 上选择 “Qt 6.7.2 → MinGW 11.2 64-bit” 时,安装器不会主动告诉你:这个 MinGW 版本是 Qt 官方用特定 patch 打包的定制版,与你本地自行安装的 MinGW-w64 11.2.0 完全不兼容。如果你之前装过其他 MinGW,并设置了全局 PATH,Qt Creator 启动时可能优先找到你本地的 gcc,导致 qmake 生成的 Makefile 调用错误编译器,编译时报一堆“undefined reference to__imp__ZN...”符号错误——这根本不是代码问题,是工具链混用。
再比如 macOS 上,安装器默认勾选 “Xcode Command Line Tools”,但它不会校验你当前 Xcode 版本是否匹配。Qt 6.6+ 要求 Xcode 14.3+,而你系统里装的是 Xcode 13.4,安装器照常进行,直到你第一次编译项目,CMake 报错 “CMAKE_OSX_DEPLOYMENT_TARGET is set to 12.3, but Xcode SDK version is 13.0” —— 这个错误信息里藏着关键线索:Qt 安装包里的 CMake 配置文件硬编码了 SDK 版本,与你本地 Xcode 不一致。
提示:在线安装器唯一不可替代的场景,是快速验证某个 Qt 版本是否解决你遇到的特定 Bug。例如 Qt 官方 Bug Report #QTBUG-12345 标注“Fixed in 6.7.2”,你无需下载整个离线包,用在线安装器选中 6.7.2 即可快速测试。但验证通过后,强烈建议将该版本转为离线包存档,用于团队分发。
2.2 离线安装包:企业级部署与教学环境的黄金标准
离线包是 Qt 官方为 LTS(长期支持)版本专门发布的完整 ISO 镜像或 .tar.xz 压缩包,命名规则清晰:qt-unified-windows-x64-4.9.1-online.exe(这是安装器) vsqt-everywhere-src-6.7.2.tar.xz(源码) vsQt6.7.2-Offline-Windows-x64-VC2019.exe(离线包)。注意,离线包名称里明确包含编译器标识(VC2019、MinGW11.2)、架构(x64)、操作系统(Windows),这是它“确定性”的根源。
我服务过一家做医疗设备HMI的公司,他们产品需通过 IEC 62304 认证,要求所有开发工具链版本必须在设计文档中固化。他们采用的方案是:每年Q1,由架构师从 Qt 官网下载Qt6.5.3-Offline-Linux-x64-gcc11.4.0.run(注意,gcc11.4.0 是他们认证通过的编译器版本),用 sha256sum 校验文件完整性,存入内部NAS,并生成一份《Qt开发环境基线声明》,明确写明:“本项目所有开发机、CI服务器、打包机,必须使用此离线包安装,禁止使用在线安装器或源码编译”。
这个做法带来的好处是:当某天客户审计问“你们怎么保证A设备和B设备的Qt运行时行为一致?”,你可以直接出示这份声明和SHA256值,而不是说“我们都是点官网下载的”。离线包的另一个隐形价值是规避网络策略风险。我曾帮某国企做国产化适配,他们的内网完全断外网,但允许U盘导入。我们提前将Qt6.6.3-Offline-Kylin-V10-ARM64.run(麒麟V10 ARM64离线包)拷贝到U盘,现场30分钟完成12台开发机部署,全程无任何网络请求——在线安装器在这种环境下根本无法启动。
2.3 源码编译:当“标准答案”无法满足你的特殊需求时
源码编译不是给新手准备的,它是 Qt 安装方式里的“手术刀”。当你遇到以下任一情况,就必须考虑源码编译:
- 目标平台极度特殊:比如你要在 RISC-V 架构的嵌入式 Linux 板卡上运行 Qt 应用,官方离线包不可能覆盖这种小众平台;
- 安全合规强制要求:金融、电力行业要求所有第三方库必须静态链接、剥离调试符号、禁用网络模块(-no-network),而离线包是动态库且含完整调试信息;
- 深度定制 Qt 行为:比如你需要修改 Qt 的事件循环机制以适配实时操作系统(RTOS)的调度约束,或者为 Qt Quick 渲染器添加私有GPU指令。
源码编译的核心命令是configure,它不是简单的“设置参数”,而是一次完整的系统能力探测与构建策略生成。以 Linux x86_64 为例,执行./configure -prefix /opt/qt6.7.2-static -static -no-shared -no-opengl -no-openssl -skip qtwebengine后,configure 脚本会:
- 检查
/usr/bin/gcc版本是否 ≥ 11.2; - 尝试编译一个测试程序验证
-static是否可用(某些发行版glibc不支持完全静态链接); - 扫描
/usr/include下是否有epoll.h,决定是否启用 epoll 事件驱动; - 读取
/proc/cpuinfo判断是否支持 AVX2 指令集,决定是否开启编译优化。
这个过程会产生一个qtbase/config.summary文件,里面详细列出每一项检测结果。这才是你判断“这次编译能否成功”的唯一依据,而不是看终端最后有没有报错。我见过太多人 configure 时跳过警告(Warning: libxcb not found),强行 make,结果编译到 80% 时在qpa/backingstore.cpp报错退出——因为 Qt GUI 模块底层严重依赖 libxcb,configure 的警告就是明确提示“你缺这个,编译会失败”。
注意:Qt 6.7+ 的源码编译已全面弃用传统的
qmake构建,必须使用 CMake。这意味着你不能再用qmake project.pro && make,而要cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/opt/qt6.7.2。这个转变不是为了炫技,而是 Qt 团队将构建逻辑彻底解耦,让 Qt 本身成为 CMake 生态的一个普通依赖项。如果你的项目还在用 qmake,现在就是升级到 CMake 的最佳时机。
3. Windows 平台安装实操:MinGW 与 MSVC 的生死抉择
Windows 是 Qt 开发最复杂的平台,核心矛盾聚焦在编译器选择:MinGW-w64 还是 Microsoft Visual Studio(MSVC)?这不是一个“哪个更好用”的主观问题,而是“哪个能让你的项目活下来”的客观选择。我用两个真实案例说明其严重性。
案例一:某工业控制软件,客户现场部署在 Windows 10 LTSC(长期服务通道)系统上。开发团队用 Qt 6.5.2 + MSVC 2019 编译,一切正常。交付后第三个月,客户反馈软件启动白屏。远程排查发现,客户机器上没有安装 Visual C++ Redistributable for Visual Studio 2019(即 vcruntime140.dll)。MSVC 编译的 Qt 应用必须依赖这个运行时库,而 LTSC 系统默认不带。解决方案只能是:要么让客户手动安装红 redistributable(但客户IT政策禁止安装任何非授权软件),要么你改用 MinGW 编译,因为 MinGW 的运行时(libwinpthread、libgcc_s)可以静态链接进可执行文件,生成真正的“绿色单文件”。
案例二:某音视频编辑工具,需要调用 NVIDIA CUDA 进行 GPU 加速。CUDA Toolkit 官方只提供 MSVC 编译器的头文件和库(.lib文件),不支持 MinGW 的.a静态库。如果你用 MinGW 编译 Qt,就无法链接 CUDA 库,所有 GPU 加速功能归零。此时,MSVC 是唯一选择,哪怕你得忍受每次发布都要打包 vcruntime140.dll。
所以,选择编译器的本质,是权衡你的分发模式与第三方依赖生态。下面我给出一套可直接抄作业的决策树:
先看你的分发目标:
- 如果目标是“免安装、双击即用”的绿色软件 → 选 MinGW,并在 configure 时加
-static(Qt 6.7+ 需--static); - 如果目标是通过 Windows Installer(.msi)或 NSIS 打包,且能控制客户安装环境 → 选 MSVC,享受更好的调试体验和性能。
- 如果目标是“免安装、双击即用”的绿色软件 → 选 MinGW,并在 configure 时加
再看你依赖的第三方库:
- 查看这些库的官方文档,是否明确标注 “Supports MSVC only” 或 “Prebuilt binaries for MinGW-w64”;
- 如果库只提供
.dll和.lib(MSVC),你必须用 MSVC; - 如果库只提供
.dll和.a(MinGW),你必须用 MinGW; - 如果两者都提供,继续看下一步。
最后看你的团队技能栈:
- 如果团队熟悉 Visual Studio 调试器(尤其是多线程、内存泄漏分析),MSVC 的集成调试体验远超 Qt Creator + MinGW;
- 如果团队主力是 Linux/嵌入式背景,对 GDB 更熟,MinGW 的 gdb 调试流程更接近标准 Unix 工具链。
3.1 MinGW 安装全流程:从下载到验证的7个关键步骤
MinGW 安装看似简单,但每个环节都有隐藏陷阱。我以 Qt 6.7.2 + MinGW 11.2 为例,拆解完整流程:
步骤1:确认系统架构与位数
右键“此电脑”→“属性”,查看“系统类型”。必须严格匹配:32位系统只能装 MinGW 32-bit,64位系统可装 32-bit 或 64-bit,但强烈推荐 64-bit。原因:Qt 6 默认启用 64-bit 指针,32-bit MinGW 编译的 Qt 库在处理大图像(>2GB)时会因地址空间不足崩溃。我曾在一个医学影像项目里,因误装 MinGW 32-bit,导致加载 4K DICOM 序列时程序静默退出,查了三天才发现是地址截断。
步骤2:下载官方 MinGW 包(非第三方)
不要去 mingw-w64.org 下载“最新版”,而要去 Qt 官网的 Qt 6.7.2 下载页 ,找到MinGW 11.2.0对应的离线包(如Qt6.7.2-Offline-Windows-x64-MinGW11.2.exe)。Qt 官方 MinGW 是用特定 patch 编译的,修复了标准 MinGW 在 Qt 多线程信号槽传递中的竞态问题。实测对比:标准 MinGW 11.2 编译的 Qt,在高频率 QTimer 触发下,信号槽连接偶尔丢失;Qt 官方 MinGW 无此问题。
步骤3:安装路径严禁含中文或空格
这是 Windows 下 Qt 的铁律。安装路径设为C:\Qt\6.7.2\mingw_112_64,而非C:\Program Files\Qt\6.7.2或D:\我的Qt\6.7.2。原因:Qt 的 qmake 工具在解析路径时,对空格和中文字符的转义处理不一致,会导致生成的 Makefile 中路径被截断。例如C:\Program Files会被识别为C:\Program,后续编译直接报错 “No rule to make target ‘Files/Qt/6.7.2/mingw_112_64/include/QtCore/qglobal.h’”。
步骤4:安装时务必勾选“Add to PATH”
在线安装器会问 “Add Qt to system PATH”,必须勾选。这会在系统环境变量 PATH 中添加C:\Qt\6.7.2\mingw_112_64\bin。验证方法:打开新命令行窗口,输入qmake -v,应显示 “Using Qt version 6.7.2 in C:\Qt\6.7.2\mingw_112_64\lib”。如果报 “'qmake' 不是内部或外部命令”,说明 PATH 未生效,需重启命令行或手动添加。
步骤5:验证 MinGW 工具链独立可用
不要只信 qmake,要验证 gcc 本身。在命令行输入:
gcc --version g++ --version mingw32-make --version三者输出版本号必须一致(如都是 11.2.0),且mingw32-make不能是 GNU Make 的别名。Qt Creator 默认调用mingw32-make,如果系统 PATH 里有 GNU Make(名字叫make),它可能被错误调用,导致 Qt 项目编译失败。解决方案:卸载 GNU Make,或确保mingw32-make在 PATH 中排在make前面。
步骤6:在 Qt Creator 中创建 Kit
打开 Qt Creator → “Tools” → “Options” → “Kits” → “Compilers”,点击 “Add” → “GCC” → “C compiler” 浏览到C:\Qt\6.7.2\mingw_112_64\bin\gcc.exe,“C++ compiler” 浏览到g++.exe。然后在 “Qt versions” 标签页,点击 “Add”,浏览到C:\Qt\6.7.2\mingw_112_64\bin\qmake.exe。最后在 “Kits” 标签页,新建一个 Kit,名称设为 “Desktop Qt 6.7.2 MinGW 64-bit”,Compiler 选刚添加的 GCC,Qt version 选刚添加的版本。关键一步:点击 “Details” 展开,检查 “Sysroot” 是否为空——MinGW 不需要 sysroot,留空即可。如果这里填了路径,Qt Creator 会尝试用错误的根目录编译。
步骤7:终极验证:编译一个最小 Qt Widgets 项目
新建项目 → “Application” → “Qt Widgets Application”,一路默认,项目名为test_minimal。在main.cpp中,将QApplication a(argc, argv);改为:
QApplication a(argc, argv); qDebug() << "Qt version:" << QT_VERSION_STR; qDebug() << "Compiler:" << qVersion(); return a.exec();点击左下角绿色三角形运行。如果控制台输出:
Qt version: "6.7.2" Compiler: "cl" // 错!这说明 Kit 选错了,实际用了 MSVC // 正确应为: Qt version: "6.7.2" Compiler: "gcc 11.2.0"并且窗口正常弹出,恭喜,你的 MinGW Qt 环境完全就绪。
3.2 MSVC 安装避坑指南:Visual Studio 版本与 Qt 的精确匹配
MSVC 的坑比 MinGW 更隐蔽,因为它不报错,只“悄悄地”给你一个不稳定的环境。核心原则:Qt 官方预编译的 MSVC 版本,必须与你本地安装的 Visual Studio 版本完全一致。Qt 6.7.2 提供的 MSVC 2019 包,只能与 Visual Studio 2019(16.11.x)配合,不能与 VS 2022(17.x)混用,反之亦然。
验证方法极其简单:打开 Visual Studio Installer,查看已安装的 VS 版本号。例如,VS 2019 的版本号格式是16.11.33,那么你必须下载 Qt 官网标注为 “MSVC 2019 64-bit” 的包。Qt 官网不会写 “MSVC 2019 16.11”,但它的构建日志里明确记录了使用的 VS 版本。你可以在 Qt 安装目录下的Qt6.7.2\msvc2019_64\mkspecs\qconfig.pri文件中找到这一行:
QMAKE_MSVC_VER = 1929这个1929就是 MSVC 的内部版本号,对应 VS 2019 16.11。如果你的 VS 是 16.10,QMAKE_MSVC_VER应为1928,版本不匹配会导致链接器(link.exe)参数不兼容,编译时出现 “LNK2038: mismatch detected for 'RuntimeLibrary'” 这类难以定位的错误。
另一个致命陷阱是Windows SDK 版本。VS 安装时,默认勾选多个 Windows SDK(如 10.0.19041.0、10.0.22621.0)。Qt 安装包是针对某个 SDK 版本编译的。你可以在qconfig.pri中找到:
QMAKE_WINSDK_VERSION = 10.0.22621.0这意味着,你的 VS 必须安装了这个 SDK,且在 Qt Creator 的 Kit 设置中,必须将 “Windows SDK Version” 设为完全一致的值。否则,Qt 的头文件(如windef.h)与 SDK 头文件冲突,编译时大量报错 “error C2061: syntax error: identifier 'LPCSTR'”。
实操心得:我现在的标准流程是——在安装 VS 前,先查好你要用的 Qt 版本对应的 SDK 版本,然后在 VS Installer 的 “Individual components” 里,只勾选那个 SDK,其他全部取消。这样既节省磁盘空间(一个 SDK 约2GB),又杜绝版本混乱。对于团队,我会用 PowerShell 脚本自动检查:
$sdkVer = (Get-Content "C:\Qt\6.7.2\msvc2019_64\mkspecs\qconfig.pri" | Select-String "QMAKE_WINSDK_VERSION").Line.Split("=")[1].Trim().Replace('"','') $installedSDKs = Get-ChildItem "C:\Program Files (x86)\Windows Kits\10\Include" | ForEach-Object {$_.Name} if ($installedSDKs -notcontains $sdkVer) { Write-Error "Missing Windows SDK $sdkVer" }
4. macOS 平台安装实战:Xcode、Command Line Tools 与签名的三重门
macOS 上 Qt 安装的复杂度,90% 来自苹果的生态封闭性。它不像 Windows 那样允许你随意替换运行时,也不像 Linux 那样可以自由编译。Qt 在 macOS 上的运行,必须同时满足三个条件:Xcode 版本匹配、Command Line Tools 激活、代码签名有效。缺一不可,否则你会看到各种诡异现象:Qt Creator 启动闪退、编译通过但应用无法打开、界面元素渲染错乱。
4.1 Xcode 版本:Qt 的“编译许可证”
Qt 官方明确声明:“Qt 6.6+ requires Xcode 14.3 or later”。这不是建议,是硬性要求。原因在于,Xcode 14.3 引入了对 Apple Silicon(M1/M2/M3)芯片的完整 Metal 图形 API 支持,而 Qt 6.6 的 QQuickRenderControl 和 Qt Quick 3D 模块深度依赖 Metal。如果你用 Xcode 14.2 编译 Qt 6.6.2,configure 阶段会通过,但编译到qtdeclarative/src/quick/scenegraph/qsgrendernode.cpp时,会因找不到<Metal/Metal.h>头文件而失败。
更麻烦的是,Xcode 版本升级后,旧版 Qt 安装包可能失效。我亲身经历:某项目用 Qt 6.5.1 + Xcode 14.1,一切正常。客户升级 macOS 系统后,Xcode 自动更新到 14.3,Qt Creator 打开项目时直接崩溃,日志显示 “dyld: Library not loaded: @rpath/QtQuick.framework/Versions/6/QtQuick”。这是因为 Qt 6.5.1 的动态库是用 Xcode 14.1 的 linker 编译的,其运行时路径(@rpath)格式与 Xcode 14.3 不兼容。
解决方案只有两个:
- 降级 Xcode:从 Apple Developer 网站下载 Xcode 14.1 的
.xip包,解压到/Applications/Xcode-14.1.app,然后执行sudo xcode-select -s /Applications/Xcode-14.1.app/Contents/Developer切换命令行工具; - 升级 Qt:下载 Qt 6.6.2 的 macOS 离线包,它专为 Xcode 14.3 构建。
我推荐后者,因为降级 Xcode 会带来新问题:你无法用新版 Xcode 打开 Swift 项目,也无法提交 App Store 更新(Apple 要求使用最新 Xcode)。所以,Qt 版本应跟随 Xcode 版本演进,而不是反过来。团队应建立一个映射表:
| Xcode 版本 | 推荐 Qt 版本 | 关键特性支持 |
|---|---|---|
| 14.3+ | Qt 6.6.2+ | Apple Silicon Metal 渲染、AVFoundation 视频加速 |
| 13.4 | Qt 6.5.1 | macOS 12 Monterey 兼容、Core Animation 优化 |
| 12.4 | Qt 6.2.4 | macOS 11 Big Sur 原生菜单栏、Dark Mode 深度集成 |
4.2 Command Line Tools:Qt 构建系统的“呼吸器官”
很多人以为安装了 Xcode,Command Line Tools 就自动有了。错。Xcode.app 里自带的 Command Line Tools 是“精简版”,缺少 Qt 构建必需的libtool、autoconf、automake等工具。Qt 的 configure 脚本在检测时,会优先查找/usr/bin/libtool,如果找不到,它会尝试用 Xcode 内置的xcodebuild替代,但这个替代方案在 Qt 6.7+ 中已被废弃。
正确做法是:安装完整版 Command Line Tools。打开终端,执行:
xcode-select --install系统会弹出对话框,点击“Install”。安装完成后,验证:
which libtool # 应输出 /usr/bin/libtool libtool --version # 应输出 "libtool (GNU libtool) 2.4.7"如果which libtool无输出,说明安装失败,需手动下载。去 Apple Developer 网站搜索 “Command Line Tools for Xcode 14.3”,下载.pkg文件安装。
注意:
xcode-select --install安装的 Command Line Tools,其路径是/Library/Developer/CommandLineTools,而 Xcode.app 的路径是/Applications/Xcode.app/Contents/Developer。Qt Creator 的 Kit 设置中,“Compiler” 的 “Platform SDK” 必须指向前者,而不是后者。指向后者会导致 Qt Creator 在编译时调用 Xcode 的完整 IDE 环境,极大拖慢构建速度。
4.3 代码签名:macOS Gatekeeper 的“入场券”
这是 Qt 新手最容易忽略,却最影响交付的环节。macOS 从 Catalina(10.15)开始,强制要求所有从互联网下载的应用必须经过 Apple 的公证(Notarization)才能运行,否则会弹出“已损坏,无法打开”的警告。Qt 应用也不例外。
签名不是编译后加个命令就行。它需要三步:
- 开发阶段签名:在 Qt Creator 的项目设置中,“Build & Run” → “Build Steps” → “Make” 下方,勾选 “Sign application bundle”,并填写你的 Apple Developer ID(如
Developer ID Application: Your Name (ABC123XYZ)); - 打包阶段公证:使用
altool或新的notarytool将.app包上传至 Apple 公证服务,等待返回公证票证(ticket); - 分发前 stapling:用
stapler staple YourApp.app将票证“钉”在应用包上,这样用户下载后无需联网验证。
如果不做第1步,Qt Creator 生成的.app包里没有签名,第2步上传会失败,报错 “The executable does not have the hardened runtime enabled”。解决方法是在 Qt 的qmake配置中加入:
QMAKE_LFLAGS += -Wl,-sectcreate,__TEXT,__info_plist,Info.plist QMAKE_LFLAGS += -Wl,-dead_strip_dylibs QMAKE_LFLAGS += -Wl,-exported_symbols_list,exported_symbols.list其中exported_symbols.list文件需手动创建,内容为:
_main _qt_main这是 Qt 应用的入口符号,必须显式导出,否则签名时会被 strip 掉。
实操心得:我在某教育类 Qt 应用上线前,因忘记第1步签名,导致所有 Mac 用户收到“已损坏”警告。紧急补救方案是:用
codesign --force --deep --sign "Developer ID Application: XXX" --options=runtime YourApp.app强制签名,但必须加--options=runtime启用“强化运行时”(Hardened Runtime),否则 Gatekeeper 仍会拦截。这个--options=runtime参数,是 macOS 10.15+ 的强制要求,老教程里根本不会提。
5. Linux 平台安装精要:发行版差异、依赖管理与嵌入式交叉编译
Linux 是 Qt 的“故乡”,但恰恰因为发行版太多,安装反而最易出错。Ubuntu、CentOS、Arch、Debian、openSUSE……每个发行版的包管理器、默认库版本、系统路径都不同。Qt 官方离线包只提供 Ubuntu/Debian 和 CentOS/RHEL 的预编译二进制,其他发行版必须源码编译。下面我以最典型的 Ubuntu 22.04 和嵌入式 Yocto 项目为例,拆解关键要点。
5.1 Ubuntu/Debian 系统:apt 与离线包的协同策略
Ubuntu 用户有个误区:认为sudo apt install qt6-base-dev就万事大吉。错。apt 安装的 Qt 是系统包,它被设计为“与系统共存”,所有库都安装在/usr/lib/x86_64-linux-gnu/,头文件在/usr/include/qt6/。这带来两个问题:
- 版本锁定:Ubuntu 22.04 默认 apt 源里只有 Qt 6.2.4,而你需要 Qt 6.7.2 的新特性;
- 权限冲突:
sudo apt install需要 root 权限,而 Qt Creator 的调试器(gdb)在非 root 用户下运行,可能导致调试时无法读取/usr/lib下的调试符号。
我的标准方案是:apt 只装构建依赖,Qt 本体用离线包。具体步骤:
- 安装基础构建工具:
sudo apt update sudo apt install -y build-essential libxcb-xinerama0-dev libxcb-xinput0-dev \ libxcb-xkb-dev libxcb-xrm0-dev libxcb-cursor0-dev libxkbcommon-dev \ libxkbcommon-x11-dev libfontconfig1-dev libfreetype6-dev libdbus-1-dev \ libicu-dev libssl-dev libglib2.0-dev libpulse-dev libudev-dev这些包名是 Ubuntu 22.04 的标准命名。注意libxcb-*系列,它们是 Qt GUI 模块的底层依赖,缺任何一个,Qt 应用启动都会黑屏或崩溃。
- 下载 Qt 6.7.2 Ubuntu 离线包(
Qt6.7.2-Offline-Ubuntu-22.04-x64.run),赋予执行权限:
chmod +x Qt6.7.2-Offline-Ubuntu-22.04-x64.run ./Qt6.7.2-Offline-U