在 Qt 的下载和安装页面中,你经常会看到类似这样的选项:
- Qt 6.5.3 for MSVC2019 64-bit
- Qt 6.5.3 for MinGW 11.2.0 64-bit
- Qt 6.5.3 for GCC 64-bit (Linux)
这些 MSVC / MinGW / GCC 并不是 Qt 的版本,而是指 Qt 库本身是用哪种 C++ 编译器编译的 。这决定了你开发时必须使用相同或兼容的编译器,否则程序无法链接或运行。
一、核心概念:ABI 兼容性
ABI(Application Binary Interface) 是二进制层面的接口规范。
不同编译器(甚至同一编译器不同版本)生成的代码 ABI 不兼容!
因此:
- 你用 MSVC 编译的 Qt 库 → 必须用 MSVC 编译你的代码
- 你用 MinGW 编译的 Qt 库 → 必须用 MinGW 编译你的代码
- 混用会导致:链接错误、崩溃、运行时异常
二、三大编译器详解
1. MSVC(Microsoft Visual C++)
- 平台:仅 Windows
- 来源:微软 Visual Studio 或 Build Tools
- 特点 :
- Windows 原生开发标准
- 性能好,调试工具强大(Visual Studio)
- 支持所有 Qt 模块(包括 WebEngine)
- Qt 安装包标识 :
msvc2019_64、msvc2022_64 - 适用场景:Windows 商业软件、游戏、高性能应用
✅ 示例:
Qt 6.5.3 for msvc2022_64= 用 Visual Studio 2022 的 MSVC v143 编译的 Qt
2. MinGW(Minimalist GNU for Windows)
- 平台:仅 Windows
- 本质 :把 Linux 上的 GCC 编译器 移植到 Windows
- 特点 :
- 生成原生 Windows 程序(
.exe),不依赖 Linux 环境 - 工具链轻量(无需安装 Visual Studio)
- 不支持 Qt WebEngine(Qt6 中官方不提供 MinGW 版 WebEngine)
- 调试体验较弱
- 生成原生 Windows 程序(
- Qt 安装包标识 :
mingw1120_64(表示 GCC 11.2.0) - 适用场景:小型项目、教学、不想装 VS 的开发者
⚠️ 注意:MinGW ≠ 跨平台!它只是"在 Windows 上用 GCC 风格编译 Windows 程序"
3. GCC(GNU Compiler Collection)
- 平台:Linux、macOS(较少)、嵌入式等
- 在 Qt 中的含义 :
- Linux 上的标准编译器
- Qt for Linux 的预编译包都是用 GCC 编译的
- Qt 安装包标识 :通常显示为
gcc_64(在 Linux 安装器中) - 适用场景:Linux 桌面/服务器应用开发
✅ 在 Linux 上,你几乎只会用 GCC,无需选择。
三、对比总结表
| 特性 | MSVC | MinGW | GCC (Linux) |
|---|---|---|---|
| 操作系统 | Windows | Windows | Linux |
| 是否需要 Visual Studio | 是(或 Build Tools) | 否 | 否 |
| Qt WebEngine 支持 | ✅ 是 | ❌ 否(Qt6) | ✅ 是 |
| 调试体验 | ⭐⭐⭐⭐⭐(VS 集成) | ⭐⭐(GDB) | ⭐⭐⭐(GDB/Qt Creator) |
| 性能 | 高 | 中 | 高 |
| 跨平台意义 | 无(仅 Windows) | 无(仅 Windows) | Linux 标准 |
| 典型 Qt 包名 | msvc2022_64 |
mingw1120_64 |
gcc_64 |
四、如何选择?
👉 如果你在 Windows 开发:
- 想做正式产品、用 WebEngine、高性能 OpenGL → 选 MSVC
- 只是学习、写小工具、磁盘空间有限 → 可选 MinGW
👉 如果你在 Linux 开发:
- 只能选 GCC(系统默认)
👉 如果你要 跨平台(Win + Linux):
- Windows 用 MSVC
- Linux 用 GCC
- 代码用 CMake + Qt 标准 API 编写,不要混用编译器!
五、各平台如何选择?
✅ Windows 上的选择
| 编译器 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
| MSVC | - 官方支持最全 - 支持 Qt WebEngine - 调试体验极佳(VS 集成) - 性能好 | - 需安装 Visual Studio(较大) | ✔ 商业软件 ✔ OpenGL/3D 应用 ✔ 需要 WebEngine |
| MinGW | - 轻量(无需 VS) - 命令行友好 | - ❌ Qt6 不提供 MinGW 版 WebEngine - 调试弱(GDB) - 某些模块支持不完整 | ✔ 学习/小工具 ✔ 磁盘空间有限 ✔ 不需要 WebEngine |
📌 Windows 推荐 :MSVC + Visual Studio 2022
✅ Linux 上的选择
| 编译器 | 说明 |
|---|---|
| GCC | Linux 下唯一主流选择。Qt 官方预编译包均为 GCC 编译。无需选择,系统默认即可。 |
📌 Linux 推荐 :直接使用系统 GCC(如 Ubuntu 的
g++包)
六、跨平台项目(Windows + Linux)如何选择?
✅ 核心策略:代码用标准 Qt API + CMake,编译器按平台分别配置
1. 代码层面
-
只使用 Qt 官方跨平台模块(QtCore, QtGui, QtWidgets, QtNetwork, QtOpenGL 等)
-
避免平台专属 API(如
QWinEvent,QDBusInterface),如需使用,用条件编译:#ifdef Q_OS_WIN // Windows 专属代码 #elif defined Q_OS_LINUX // Linux 专属代码 #endif
2. 构建系统
- 必须使用 CMake(Qt6 官方主推,qmake 已逐步淘汰)
- CMake 能自动适配不同平台的编译器和库路径
3. 编译器选择(按平台独立)
| 平台 | 推荐编译器 | Qt 安装包选择 |
|---|---|---|
| Windows | MSVC 2022 | Qt 6.x for msvc2022_64 |
| Linux | GCC | Qt 6.x for gcc_64 |
💡 你不需要"统一编译器",只需要"统一代码和构建逻辑"。
七、跨平台项目示例结构
MyProject/
├── CMakeLists.txt ← 跨平台构建脚本
├── src/
│ ├── main.cpp
│ └── MyWidget.h/cpp
└── README.md
CMakeLists.txt(跨平台通用)
cmake_minimum_required(VERSION 3.16)
project(MyApp LANGUAGES CXX)
find_package(Qt6 REQUIRED COMPONENTS Core Widgets OpenGL)
add_executable(${PROJECT_NAME}
src/main.cpp
src/MyWidget.cpp
)
target_link_libraries(${PROJECT_NAME} PRIVATE
Qt6::Core
Qt6::Widgets
Qt6::OpenGL
)
set_target_properties(${PROJECT_NAME} PROPERTIES
AUTOMOC ON
AUTOUIC ON
AUTORCC ON
)
构建命令(各平台)
-
Windows(MSVC):
cmake -S . -B build -G "Visual Studio 17 2022" cmake --build build --config Release -
Linux(GCC):
cmake -S . -B build cmake --build build
✅ 同一套代码,两个平台都能编译运行!
八、常见误区
| 误区 | 正确理解 |
|---|---|
| "MinGW 是跨平台的" | ❌ MinGW 只能在 Windows 上生成 Windows 程序 |
| "Qt 自带编译器" | ❌ Qt 只提供库,编译器需单独安装 |
| "用同一个 Qt 安装包跑所有平台" | ❌ 必须为每个平台安装对应编译器的 Qt 包 |
| "qmake 比 CMake 更简单" | ❌ Qt6 已转向 CMake,未来 qmake 支持会减弱 |
九、总结:如何选择?
| 场景 | 推荐方案 |
|---|---|
| 仅 Windows 开发 | Qt + MSVC 2022(功能全、稳定) |
| 仅 Linux 开发 | Qt + GCC(系统默认) |
| 跨平台(Win + Linux) | * 代码:纯 Qt 标准 API * 构建:CMake * Windows:MSVC * Linux:GCC |
| 学习/轻量项目(Windows) | 可选 MinGW(但放弃 WebEngine) |
💡 终极口诀 :
"代码跨平台,编译器本地化;CMake 统一构建,Qt API 保兼容。"