这个【Qt笔记】系列我打算从环境搭建开始写。最近大部分C++项目都从Qt Creator搬到了VSCode上,原因是轻量、编辑体验好、CMake工程管得顺,调试也能接得上。这篇是系列第一篇:VSCode搭建Qt运行环境。我尽量把从下载安装到第一个窗口跑起来的全局过程写清楚,插件版本、路径设置、CMake模板、调试配置都会覆盖。适合刚接触Qt的小白,也适合原来一直用Qt Creator、现在想换到VSCode试水的开发者。整篇按我一个一个试通的方式记录,你在自己机器上操作时,路径和版本记得换成自己的。
1. 为什么选 VSCode + Qt 这套组合
1.1 Qt Creator 已经很好,为什么还要换
先说结论:Qt Creator 依然是Qt开发最省心的官方IDE,尤其是做.ui界面设计、看帮助文档、直接点击运行,开箱即用。但它的定位是“一个完整IDE”,启动速度、界面拥挤程度、编辑器的扩展生态,和现在的主流编辑器比起来有一些历史包袱。
VSCode这边,C/C++插件把IntelliSense做得很稳,CMake Tools插件让配置、构建、运行、调试都变成了状态栏按钮,写代码时还能用一套统一的编辑器操作,不用在多个IDE之间来回切。更重要的是,团队里其他同事可能不用Qt,只装了VSCode,大家维护同一套CMake工程就非常舒服。
当然,VSCode不是万能的。Qt的UI设计器没有官方插件能在VSCode里完整使用,.ui文件通常还是要在Qt Creator或者单独的设计工具里打开,或者直接用代码布局。标题说“搭建Qt运行环境”,我理解的重点其实是编译、链接、运行、调试这条路要能闭环,UI设计属于另一层问题,不在本文范围。
1.2 这套环境适合谁,不适合谁
我建议下面几类人可以优先尝试VSCode + Qt:第一,团队里已经有成熟的CMake工程,不想被IDE的工程文件绑死;第二,跨平台开发,Windows、Linux、macOS都有统一编辑体验;第三,重度依赖代码补全、多光标、远程开发、代码分屏,喜欢把工具链搭成自己熟悉的样子。
反过来,如果你主要在拖控件画界面,依赖Qt Designer的可视化布局,或者刚接触C++不太想折腾编译器、CMake、环境变量这些概念,我建议先老老实实用Qt Creator。等对Qt的构建方式、目录结构都熟了,再回来看VSCode,会顺畅得多。
我个人的原则很简单:编辑器是工具,不是信仰。VSCode这套方案是否适合你,取决于具体项目和你的使用习惯。搭建环境的过程其实就是在理解Qt构建系统的过程,无论最后用不用,都不亏。
2. 动手之前,先把三件事想明白
2.1 Qt 版本:Qt5 还是 Qt6
这是第一个容易让新手纠结的问题。目前网上大量教程还在用Qt5,而官方新项目推荐Qt6。对于环境搭建来说,两者最大的区别在CMake接口和license、模块划分上,核心的Widgets界面程序差异不算太大,Qt6对C++17和CMake的支持更现代,很多函数也更统一。
如果你只是学习Widgets,做小型桌面工具,我建议直接用Qt6,比如6.5或6.6系列,长期更新维护更稳。如果你的项目依赖某些老模块,或者用的是旧教材、旧代码,那Qt5.15的离线安装包也可以,但要注意Qt5.15商业和开源版本的在线安装组件有些差异,自己装了才知道。
其实版本不是越新越好。Qt6的CMake API在6.3之后逐渐成熟,比如qt_standard_project_setup()这个函数,更老的版本就没有。示例代码里我会同时给出Qt6和Qt5两种CMakeLists写法,你按自己的实际版本来选。
2.2 编译器:MinGW 和 MSVC 必须和 Qt 组件保持一致
Qt下载页里常见的Windows安装包有mingw_64和msvc2019_64这种名字,意思分别是:这个Qt库是用MinGW编译器编译的,还是用Visual Studio的MSVC编译器编译的。这一步不能选错,选错了后面编译会报无数链接错误。
MinGW是一套GCC工具链,跟着Qt安装包一起分发,不需要另装Visual Studio,体积小、环境隔离好,对VSCode用户很友好。MSVC编译的Qt库需要你机器上有对应的Visual Studio Build Tools,VSCode也能调用,但调试器、环境变量会复杂一截。我笔记里的示例以MinGW为主。
安装Qt时,组件列表里会有Qt xxx (MinGW x.x.0 64-bit)这样的条目,还会配一套Tools > MinGW x.x.x。这套MinGW和Qt库是官方匹配好的,最省事的方式就是直接用这套,不要自己另装别的GCC去顶替。
2.3 安装目录、环境变量和工具链规划
很多人会在这一步踩坑。Qt装在中文路径、带空格的目录里,CMake、Ninja、VSCode插件解析起来容易出现奇怪的错。建议装到类似D:\Qt这种纯英文无空格的目录下。
环境变量要规划三块:Qt库的bin目录、MinGW的bin目录、CMake和Ninja安装目录。Qt的bin目录里面有Qt6Core.dll、Qt6Gui.dll这些运行库,编译出的exe运行时需要找到它们;MinGW的bin目录里面有g++、gcc、gdb;CMake和Ninja是构建系统依赖。
如果你把所有这些目录都加进系统PATH,最省心,但也会让系统环境变量变得很乱。我更推荐的做法是:安装阶段加好,运行阶段通过CMake和VSCode设置去指定,而不是把所有东西都塞到全局PATH里。后面第4、5章会具体说。
3. 从零开始安装:Qt、VSCode、CMake 和 Ninja
3.1 下载并安装 Qt
Qt官方提供在线安装器和离线安装包。在线安装器会先让你登录Qt账户,再选择组件,体积可控;离线安装包一次下载完整,体积大,适合需要特定版本、或者想在公司内网离线安装的场景。搜索“qt下载”“qt离线安装包下载”一般就能找到官方链接,版本列表里选你自己需要的。
安装器启动后,选自定义安装。组件树里注意展开对应版本号,勾选你要的Qt模块,比如Qt 6.6.3 > MinGW 11.2.0 64-bit,下面可能还有Sources、Additional Libraries等子项,能勾就勾,后面编译第三方库时会用到。还要在Tools目录下勾选同一套MinGW,这是最容易漏的地方:Qt库装了,但对应的编译器没装,后面CMake找kit的时候一脸懵。
安装路径务必改成纯英文。安装时间取决于组件多少,可能几分钟到几十分钟。装完之后检查一下目录结构,应该会看到类似D:\Qt\6.6.3\mingw_64和D:\Qt\Tools\mingw1120_64两个重要目录,后面所有配置都以这两个为准。
3.2 VSCode 安装和必要插件
VSCode直接从官网下载安装包就行,安装时建议勾选“添加到PATH”。装完后第一步可以安装中文语言包,把界面语言切成中文,找配置项更方便。搜索Chinese (Simplified),安装后右下角提示重启,点一下就好。
真正决定Qt开发体验的是三个插件:
C/C++:微软官方插件,提供IntelliSense、调试支持、c_cpp_properties.json管理。CMake Tools:负责CMake工程的配置、构建、运行、调试入口,是整个流程的“遥控器”。CMake:提供CMake语法高亮和辅助提示,和CMake Tools配合使用。
这三个装完,基础就齐了。有些第三方Qt插件也能提代码提示,比如Qt tools、Qt Config之类,但现在更新质量参差不齐,我倾向于不依赖它们,直接用CMake和系统头文件路径来支撑IntelliSense。
3.3 安装 CMake、Ninja 和调试器
CMake 是构建系统的核心,软需单独安装。去CMake官网下载Windows installer,安装时勾选“Add CMake to system PATH”,装完在终端输入cmake --version,能正常输出版本号才算成功。
Ninja是一个更轻量、速度更快的构建工具,VSCode的CMake Tools默认会尝试用它。但很多人的机器上并没有Ninja.exe,第一次configure时就会看到“Could not find Ninja”之类的错。解决办法有两个:要么下载Ninja的zip,解压到一个纯英文目录,把路径加入PATH;要么在VSCode设置里把generator改成MinGW Makefiles,让CMake用Qt自带的MinGW make工具来构建。
调试器取决于你的编译器。如果用了Qt包自带的MinGW,那gdb.exe就在MinGW的bin目录里,比如D:\Qt\Tools\mingw1120_64\bin\gdb.exe。如果用了MSVC,调试器是Visual Studio那一套,配置会更复杂,对新手不友好,所以这篇示例统一走MinGW。
4. 把这套环境跑通:CMake 工程实例
4.1 建立工程目录,写一个能验证环境的 main.cpp
先把最小的工程建出来。我习惯在D:\projects下新建一个目录,名字用英文,比如QtVSCodeDemo。目录结构很简单:
QtVSCodeDemo/ ├─ CMakeLists.txt └─ src/ └─ main.cppmain.cpp先写一个最简单的Qt Widgets程序,作用是弹出一个窗口,窗口上显示一行文字。这个程序能跑通,说明Qt库、编译器、CMake、运行库路径整条链路都是通的。
#include <QApplication> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label("Hello Qt in VSCode"); label.resize(320, 120); label.show(); return app.exec(); }写完先别急着编译。这个程序虽然简单,但依赖Qt Widgets模块,如果CMake配置不对,第一步都过不去。我们先把CMakeLists写对。
4.2 CMakeLists.txt:Qt6 与 Qt5 两种写法
Qt6版本推荐用官方新式CMake接口,以我本机Qt 6.6.3为例,CMakeLists这样写:
cmake_minimum_required(VERSION 3.21) project(QtVSCodeDemo 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) set(CMAKE_PREFIX_PATH "D:/Qt/6.6.3/mingw_64") find_package(Qt6 REQUIRED COMPONENTS Widgets) qt_standard_project_setup() qt_add_executable(QtVSCodeDemo src/main.cpp ) target_link_libraries(QtVSCodeDemo PRIVATE Qt6::Widgets)关键要理解几个点:CMAKE_AUTOMOC让CMake自动处理Qt的元对象编译器,类里写Q_OBJECT才会正常生成moc文件。CMAKE_PREFIX_PATH告诉CMake到哪个目录找Qt的config文件,这里必须指向Qt版本目录下那个带编译器名称的文件夹。qt_standard_project_setup()会帮我们设置默认的编译选项和自动处理步骤,Qt6.3之后可用。
如果用的是Qt5,要稍微改一下:
cmake_minimum_required(VERSION 3.16) project(QtVSCodeDemo VERSION 1.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_PREFIX_PATH "D:/Qt/5.15.2/mingw81_64") find_package(Qt5 REQUIRED COMPONENTS Widgets) add_executable(QtVSCodeDemo src/main.cpp ) target_link_libraries(QtVSCodeDemo PRIVATE Qt5::Widgets)Qt5和新式接口的主要区别是没有qt_standard_project_setup()和qt_add_executable(),用传统的add_executable加上target_link_libraries就够了。CMAKE_INCLUDE_CURRENT_DIR是Qt5时代为了自动包含moc生成文件的常用设置。
4.3 用 CMake Tools 完成第一次配置
写完CMakeLists,用VSCode打开QtVSCodeDemo文件夹。左侧扩展匹配到CMakeLists后,CMake Tools一般会弹提示“是否配置此项目”,点“是”进入配置流程。
如果没有弹,可以打开命令面板,输入CMake: Select a Kit,选择一个编译器套件。这里要注意:选kit时不是选Qt版本,而是选编译器。比如选名字里带“MinGW”的那一项。如果列表里没有,点“Scan for kits”重新扫描,或者打开cmake-kits.json手动配置:
[ { "name": "Qt MinGW64", "compilers": { "C": "D:/Qt/Tools/mingw1120_64/bin/gcc.exe", "CXX": "D:/Qt/Tools/mingw1120_64/bin/g++.exe" }, "preferredGenerator": { "name": "Ninja" } } ]选好kit后,再执行CMake: Configure。观察底部输出面板,如果没有红色错误,会看到类似“Build files have been written”的提示。然后执行CMake: Build,等待编译输出,成功后会生成build目录和可执行文件。整个过程里最常见的错误就是找不到Qt、找不到Ninja、或者编译器不匹配,我们后面第6章集中说。
5. 调试配置与日常操作
5.1 配置 IntelliSense:c_cpp_properties.json
构建已经能跑了,但写代码时如果头文件下面全是红线,那是IntelliSense没配置好。VSCode的C/C++插件默认会照编译器推断头文件路径,可Qt头文件通常不在系统默认的include目录下,所以我们要显式指定。
在.vscode目录下新建c_cpp_properties.json,写这样一份配置:
{ "configurations": [ { "name": "Qt6", "includePath": [ "${workspaceFolder}/**", "D:/Qt/6.6.3/mingw_64/include/**" ], "defines": [ "UNICODE", "_UNICODE", "QT_WIDGETS_LIB" ], "compilerPath": "D:/Qt/Tools/mingw1120_64/bin/g++.exe", "cStandard": "c17", "cppStandard": "c++17", "intelliSenseMode": "windows-gcc-x64" } ], "version": 4 }这里最关键的是includePath,D:/Qt/6.6.3/mingw_64/include/**这个通配路径会把QtWidgets、QtCore、QtGui等所有模块的头文件都包含进来。QT_WIDGETS_LIB这个宏是让IntelliSense在处理Qt Widgets相关头文件时能匹配到正确的导出定义,不加也能用,加了更准。
改完后重启VSCode或者重新加载窗口,红色波浪线基本就消失了。如果还有个别头文件找不到,多半是Qt版本路径写错,或者includePath里的版本目录和你实际安装的不一致。
5.2 运行、调试和启动配置
CMake Tools插件本身提供了很顺手的运行按钮。配置并构建成功后,底部状态栏会出现“Launch”按钮,旁边是当前构建目标下拉框。点击Launch,就能直接启动exe,看到“Hello Qt in VSCode”窗口。
如果要在代码里打断点调试,有两种方式。第一种最简单:还是用CMake Tools,在下拉框旁边选择Debug模式,点击调试按钮,VSCode会启动GDB,命中断点后可以看变量、堆栈、表达式。第二种是按F5,但需要手动写一份launch.json:
{ "version": "0.2.0", "configurations": [ { "name": "Qt MinGW Debug", "type": "cppdbg", "request": "launch", "program": "${command:cmake.launchTargetPath}", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "D:/Qt/Tools/mingw1120_64/bin/gdb.exe", "setupCommands": [ { "description": "Enable pretty printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] }这个配置里program直接用了CMake Tools提供的变量,指向当前构建目标的exe路径,非常方便。miDebuggerPath一定要指向你实际MinGW目录里的gdb.exe。如果使用MSVC工具链,调试类型要改成cppvsdbg,参数完全不同。
5.3 环境验证:窗口出现才算成功
环境搭得好不好,最终靠运行结果说话。第一次构建成功并点击Launch后,如果屏幕上弹出了QLabel窗口,说明Qt动态库被正确加到了PATH里,编译器能联系到Qt库,运行库也能被系统找到。
我习惯在这个阶段多验证几步:在main.cpp里加一行#include <QDebug>,在main函数里写qDebug() << "Qt ready";,重新构建运行。如果VSCode的debug console或终端能打印出这行日志,说明qDebug函数没问题,后续排查问题就多了个输出通道。
还有一个容易忽略的点:如果你在VSCode里能运行,但双击桌面上的exe会报缺失DLL,说明系统PATH里没有Qt的bin目录,或者没有做部署。开发调试阶段,建议在系统环境变量里把Qt的bin目录加进去,后面要发布软件时再用windeployqt.exe做专门部署。
6. 常见问题与避坑实录
6.1 问题速查表
我把配置过程中最常见的几类问题整理成了表格,方便你对照排查。表里每一类我都遇到过至少一次,不是凭空想的。
| 现象 | 常见原因 | 解决办法 |
|---|---|---|
| CMake报错找不到Qt5/Qt6的Config文件 | CMAKE_PREFIX_PATH没设置,或路径不是Qt的编译器目录 | 在CMakeLists或CMake配置参数里指定正确路径 |
提示Could not find ninja | CMake Tools默认用Ninja,但系统没装Ninja | 安装Ninja并加入PATH,或把generator改成MinGW Makefiles |
编译时报一堆找不到QApplication头文件 | IntelliSense或CMake没找到Qt include目录 | 增加CMAKE_PREFIX_PATH并配置c_cpp_properties.json |
运行exe时提示缺少Qt6Core.dll等动态库 | 系统PATH里没有Qt的bin目录 | 把Qt版本目录下的bin文件夹加入PATH |
链接时大量unresolved external symbol | 编译环境和Qt库的编译器不一致,比如MinGW连MSVC版Qt | 重新安装匹配的MinGW版Qt,或让编译器与Qt组件一致 |
| 源码里中文乱码 | 文件编码和编译器读取编码不一致 | 文件保存为UTF-8,字符串用QStringLiteral包裹 |
使用串口模块时报unknown module(s) in qt: serialport | Qt组件没安装SerialPort模块 | 打开Qt维护工具,勾选SerialPort模块后重新构建 |
6.2 我实际踩过的三个大坑
第一个坑是编译器版本匹配。我最初图省事,安装了MSVC版的Qt5.15,却在VSCode里选了MinGW的GCC编译器,结果configure能过,一编译就报几十个链接错误,全是“无法解析的外部符号”。排查了半天才反应过来,Qt库是谁编译的,调用方就必须用同样的编译器。后来改了MinGW版Qt并重新选Kit,问题立刻消失。
第二个坑是路径里的中文和空格。我一开始把工程放在D:\学习\Qt Demo里,CMake配置阶段老是报路径解析失败,VSCode的一些插件甚至会卡住。把所有路径改成D:\projects\QtDemo之后,问题消失了。Qt安装目录也建议用纯英文,不然有些工具链脚本会直接把路径切成乱码。
第三个坑是运行库PATH。CMake构建成功,Launch也能跑,但我退出VSCode后直接去build目录双击exe,系统却提醒缺少Qt6Widgets.dll。原因是VSCode环境变量可能继承了全局PATH,但我没在系统里配置Qt bin目录。后来我在系统环境变量里加了D:\Qt\6.6.3\mingw_64\bin,双击调试才变得正常。
6.3 下一步还能玩什么
环境跑通之后,Qt的很多内容都可以慢慢折腾了:界面设计、自定义进度条、绘图事件、国际化、JSON读写、串口通信,都是非常实际的开发场景。比如国际化需要用到Qt Linguist和.ts文件,环境里只是多一条生成翻译文件的命令;串口模块要提前在Qt安装器里勾选Qt SerialPort组件,否则pro或CMake里写了serialport就会报“unknown module(s)”的错。
有了这套运行环境,后面每篇笔记我都会按同样的逻辑去写:先讲清楚要解决什么,再给最小的可运行工程,然后说底层原理和常见坑。VSCode好就好在工程文件都是纯文本,怎么配置都能看得一清二楚,学习成本反而低。
最后再补一个我现在的习惯:新建Qt工程时,我会先用Qt Creator快速生成一份参考CMakeLists,再回VSCode里手动整理一遍,保证每个配置参数都心里有数。这套环境我用了大半年,日常开发没再碰过Qt Creator,遇到问题基本都是路径和工具链不匹配。你配的时候如果碰到表格里没列到的错,也建议往这两个方向去排查,八成能解决。