1. 为什么要在 Windows 上折腾 CLion 加 ESP-IDF
很多人第一次接触 ESP32 开发,都是被官方那一套基于 Eclipse 的 IDE 劝退的。界面老旧、补全迟钝、索引动不动就卡死,写个printf都要等半天。后来 Espressif 官方推出了基于 VS Code 的插件,情况好了不少,但对于长期写 C/C++ 的人来说,CLion 的代码分析能力、重构能力和调试体验,依然是另一个层级的东西。
这套组合的核心价值在于:用 CLion 这个顶级的 C/C++ IDE,去驱动 ESP-IDF 这套完整的嵌入式开发框架,在 Windows 上跑通从新建工程、编译、烧录到串口调试的完整链路。它解决的问题很具体——让你在写 ESP32 代码时,拥有接近桌面级 C++ 开发的智能提示、跳转、重构和断点调试体验,而不是在一个半残的编辑器里靠记忆写 API。
适合谁来参考?三类人最合适。第一类是有一定 C/C++ 基础,但被 ESP-IDF 原生工具链折腾过的开发者;第二类是从 STM32、Arduino 转过来,想认真做 ESP32 产品的人;第三类是已经用过 VS Code 方案,但觉得代码导航不够爽、想升级工具链的老手。纯小白也能看,但需要你对命令行、环境变量这些概念不陌生,否则配置过程中会有点懵。
需要提前说清楚的是,CLion 对 ESP-IDF 的支持并不是官方一等公民,它走的是CMake 工程这条路。ESP-IDF 本身用 CMake 构建,CLion 又原生支持 CMake,所以两者能对接上。但对接过程中有几个关键点必须处理对,否则你会遇到"能编译但没提示""能跳转但烧录失败"这类割裂问题。下面我把整套流程拆开讲,包括每一步为什么这么做、参数怎么定、坑在哪里。
2. 环境整体设计与工具选型思路
2.1 为什么是 CLion 而不是 VS Code 或 Eclipse
先把选型逻辑讲透,不然后面配置时你会怀疑自己为什么要这么麻烦。
Eclipse 方案是官方最老的路径,优点是"开箱即用",缺点是它本质上是个 Java 写的通用 IDE,对 C++ 的语义分析能力弱,大型工程里索引慢、内存占用高。VS Code 方案靠 C/C++ 插件加 Espressif IDF 插件,轻量灵活,但它的智能提示依赖插件的配置质量,遇到复杂的宏展开、模板、条件编译时,跳转经常失灵。
CLion 的优势在于它内置了Clangd 级别的代码分析引擎(实际是 JetBrains 自研的 C++ 解析器),对宏、模板、条件编译的处理明显更稳。而且它的 CMake 集成是原生的,能直接读取 ESP-IDF 生成的编译数据库,索引准确率高。代价是 CLion 是商业软件,需要授权,且资源占用比 VS Code 高。
所以选型的本质是:你更看重代码分析的准确性,还是更看重轻量和免费。如果你每天要写几百行 ESP32 代码,CLion 的体验提升是值得的。
2.2 ESP-IDF 的安装方式选择:离线包还是在线安装器
ESP-IDF 在 Windows 上有两种主流安装方式。
第一种是官方离线安装包(Windows Installer),它会把工具链、Python、Git、IDF 本体全部打包,一键装完,还会自动配置好环境变量。优点是省心,缺点是版本更新麻烦,且它默认装的是它自己那套 Python 环境,和你系统里的 Python 可能冲突。
第二种是在线安装器(IDF Installer / idf_tools.py 手动装),你可以自己指定 IDF 版本、工具链路径、Python 环境。灵活度高,适合需要多版本共存或想接入已有开发环境的人。
我的建议是:如果你只做 ESP32,用离线安装包最省事;如果你同时搞其他嵌入式或 Python 项目,用在线方式自己管理环境更干净。本文以离线安装包为主,因为它对新手最友好,出问题的概率最低。
2.3 工具链版本匹配的坑
这里有个很多人忽略的点:CLion 版本、CMake 版本、ESP-IDF 版本、工具链版本,四者之间存在兼容性关系。
ESP-IDF 每个大版本对 CMake 的最低版本有要求,比如 IDF 5.x 要求 CMake 3.16 以上。而 CLion 自带的 CMake 版本是固定的,如果你用 CLion 内置的 CMake,可能和 IDF 要求的不一致。解决办法是让 CLion 使用 IDF 工具链里自带的 CMake,而不是它自己的。
工具链方面,ESP32、ESP32-S3、ESP32-C3 用的编译器不完全一样。ESP32 和 S3 是 Xtensa 架构,C3 是 RISC-V 架构。离线安装包会把这些工具链都装上,但你在 CLion 里配置时要选对目标芯片对应的工具链前缀,否则会出现"编译通过但链接失败"或"指令集不匹配"的问题。
3. 核心细节解析与实操要点
3.1 安装 ESP-IDF:路径里绝对不能有空格和中文
这一步看似简单,但踩坑率极高。ESP-IDF 的构建系统对路径非常敏感,安装路径中如果包含空格、中文、特殊字符,编译时会出现各种莫名其妙的错误,比如找不到文件、路径解析失败、Python 脚本报错。
推荐路径:C:\Espressif或D:\esp\esp-idf。不要装在C:\Program Files下,因为 Program Files 带空格。也不要装在桌面或"我的文档"里,因为中文用户名会导致路径含中文。
离线安装包运行后,会让你选择安装路径和 IDF 版本。选好之后它会自动下载并安装以下组件:
- ESP-IDF 本体(源码)
- Xtensa 和 RISC-V 工具链
- CMake 和 Ninja 构建工具
- Python 环境及依赖
- 可选的 ESP32 相关驱动
安装完成后,安装器会提供一个"运行 ESP-IDF 命令行"的快捷方式,这个命令行已经预设好了所有环境变量。你可以先在里面跑一句idf.py --version验证安装是否成功。
注意:如果你之前装过 Python 或 Git,安装器可能会提示复用或新建环境。建议让它新建独立环境,避免和你系统里的 Python 包冲突。
3.2 验证 IDF 环境:先跑通命令行再碰 IDE
在配置 CLion 之前,务必先在 ESP-IDF 命令行里把一个示例工程编译通过。这一步是分界线:如果命令行都编译不过,那 CLion 里更不可能成功,问题会被 IDE 的配置层掩盖,排查起来更痛苦。
操作步骤:
- 打开"ESP-IDF 命令行"快捷方式。
- 进入示例目录,比如
cd %IDF_PATH%\examples\get-started\hello_world。 - 执行
idf.py set-target esp32(根据你的芯片改,S3 就写 esp32s3)。 - 执行
idf.py build。
如果最后看到Project build complete,说明工具链、Python、CMake 全部正常。这时候再进 CLion,你面对的就是一个已知能工作的环境,出问题只可能是 IDE 配置层面,排查范围大大缩小。
3.3 CLion 的 CMake 配置:让它用 IDF 的 CMake 而不是自己的
这是整套配置里最关键的一步。CLion 默认使用它捆绑的 CMake,但 ESP-IDF 需要特定版本的 CMake,且需要 IDF 的环境变量(比如IDF_PATH、工具链路径)才能正确构建。
正确做法是在 CLion 的 CMake 配置里,指定使用 IDF 工具链中的 CMake,并传入 IDF 需要的环境变量。
具体操作路径:File -> Settings -> Build, Execution, Deployment -> CMake,在 CMake options 里填入 IDF 相关的参数,同时把 CMake executable 指向 IDF 工具链里的 cmake.exe。
这里涉及一个核心概念:ESP-IDF 的 CMake 构建依赖一个叫project.cmake的入口文件,它需要知道IDF_PATH在哪。CLion 如果不知道这个路径,就会报"找不到 project.cmake"。
所以你要在 CMake options 里加上类似这样的参数:
-DIDF_PATH=C:/Espressif/frameworks/esp-idf-v5.x -DIDF_TARGET=esp32同时,工具链文件也要指定。ESP-IDF 提供了一个toolchain-esp32.cmake,位置在 IDF 的tools/cmake/目录下。你需要在 CMake options 里通过-DCMAKE_TOOLCHAIN_FILE指向它。
提示:路径分隔符在 CMake 里用正斜杠
/或双反斜杠\\,不要用单反斜杠,否则会被当成转义字符。
3.4 环境变量注入:CLion 启动时就要带上 IDF 的变量
即使 CMake 配置对了,CLion 在构建时还需要一系列环境变量,比如PATH里要有工具链的 bin 目录,IDF_PATH要指向 IDF 源码,PYTHON要指向 IDF 的 Python。
有两种注入方式。第一种是在 CLion 的 CMake profile 里手动添加环境变量,适合变量少的情况。第二种是让 CLion 从一个脚本里加载环境变量,适合变量多、需要复用的场景。
ESP-IDF 安装后会在安装目录下生成一个export.bat(或export.ps1),这个脚本执行后会把所有需要的环境变量设置好。你可以在 CLion 的构建配置里,让它在构建前先执行这个脚本,或者干脆用一个包装脚本启动 CLion,先 source 这个 export 脚本再启动 IDE。
我个人的做法是写一个launch_clion.bat,内容大致是:
@echo off call C:\Espressif\frameworks\esp-idf-v5.x\export.bat start "" "C:\Program Files\JetBrains\CLion\bin\clion64.exe"这样 CLion 启动时就继承了完整的环境变量,省去在 IDE 里逐个配置的麻烦。
4. 实操过程与核心环节实现
4.1 从零新建一个 ESP-IDF 工程并在 CLion 打开
假设你已经装好 IDF 和 CLion,现在要新建一个工程。
第一步,用 IDF 命令行创建工程骨架。ESP-IDF 提供了idf.py create-project命令:
idf.py create-project my_esp_project cd my_esp_project这会生成一个最小工程,包含CMakeLists.txt、main/CMakeLists.txt和main/main.c。
第二步,用 CLion 打开这个工程目录。CLion 会自动识别到CMakeLists.txt,并尝试配置 CMake。这时候如果你前面的 CMake options 和环境变量都配好了,它会开始索引。
第三步,检查索引结果。打开main.c,看看#include "freertos/FreeRTOS.h"这类头文件能不能跳转。如果能跳转,说明索引成功;如果显示红色波浪线,说明头文件路径没被正确识别,需要回头检查 CMake 配置。
这里有个细节:ESP-IDF 的头文件路径是通过 CMake 的target_include_directories动态生成的,CLion 需要先成功执行一次 CMake configure,才能拿到这些路径。所以第一次打开工程时,一定要等 CMake configure 跑完,不要急着看代码。
4.2 编译配置:Debug 和 Release 的取舍
ESP-IDF 默认的构建类型是 Debug,带-Og优化和调试符号。对于开发阶段,这没问题。但如果你要做性能测试或最终固件,需要切到 Release。
在 CLion 里,你可以通过 CMake profile 切换构建类型。但要注意,ESP-IDF 的构建类型不完全等同于标准 CMake 的 Debug/Release,它有自己的CONFIG_选项体系,通过sdkconfig文件管理。
所以更准确的做法是:在 CLion 里保持 CMake 的构建类型,同时通过idf.py menuconfig或直接编辑sdkconfig来调整 IDF 层面的编译选项,比如优化等级、日志级别、分区表等。
一个常见的坑是:在 CLion 里改了 CMake 构建类型,但sdkconfig里的优化选项没变,导致实际编译结果和预期不符。记住,IDF 的编译选项以sdkconfig为准,CMake 构建类型只影响一部分行为。
4.3 烧录配置:让 CLion 一键烧录到板子
CLion 本身不直接支持idf.py flash,但你可以通过配置 External Tool 或 Run Configuration 来实现。
最简单的方式是配置一个 External Tool:
- Program:
idf.py(或者 IDF 的 python 加 idf.py 的完整路径) - Arguments:
-p COM3 flash - Working directory:
$ProjectFileDir$
其中COM3要换成你板子实际的串口号。你可以在设备管理器里查看。
配置好后,在 CLion 的 Tools 菜单里就能直接调用这个工具,实现一键烧录。更进一步,你可以把它绑定到快捷键,或者配置成 Run Configuration 的 Before launch 任务,实现"编译完自动烧录"。
注意:烧录时串口不能被其他程序占用。如果你同时开着串口监视器,要先关掉,否则会报"串口打开失败"。
4.4 串口监视与调试:idf.py monitor 的集成
idf.py monitor是 ESP-IDF 自带的串口监视器,支持日志解析、颜色高亮、快捷键操作(比如 Ctrl+] 退出)。在 CLion 里集成它,同样用 External Tool 的方式。
配置参数:
- Program:
idf.py - Arguments:
-p COM3 monitor - Working directory:
$ProjectFileDir$
这样你就能在 CLion 里直接打开串口监视器,看到板子的输出日志。
如果你要做断点调试,那就需要用到 OpenOCD 和 GDB。ESP-IDF 支持 JTAG 调试,你需要一块支持 JTAG 的调试器(比如 ESP-Prog 或板载 USB-JTAG)。配置流程是:先启动 OpenOCD,再让 CLion 的 GDB 连接到 OpenOCD 的端口。这部分配置相对复杂,涉及openocd的配置文件、GDB 的 target remote 命令等,建议单独花时间研究。
4.5 参数计算:分区表和 Flash 大小的匹配
在idf.py menuconfig里,有一个容易出错的配置项是分区表和 Flash 大小。
假设你的 ESP32 模组是 4MB Flash,但分区表配置成了 8MB 的布局,编译时可能不报错,但烧录后运行会出问题,因为实际 Flash 不够。
分区表的大小计算逻辑是:所有分区的大小之和,不能超过 Flash 总大小,还要留出一定的余量给系统数据(比如 NVS、OTA 数据)。
一个典型的分区布局:
| 分区名 | 类型 | 大小 | 用途 |
|---|---|---|---|
| nvs | data | 24KB | 非易失存储 |
| phy_init | data | 4KB | 射频校准 |
| factory | app | 1MB | 主程序 |
| storage | data | 剩余 | 用户数据 |
如果你开了 OTA,还需要两个 app 分区(ota_0 和 ota_1),每个都要能放下完整固件。所以 Flash 至少要 4MB 才比较从容。
在 menuconfig 里,Partition Table选项下可以选预定义的分区表,也可以自定义 CSV 文件。建议新手先用预定义的Single factory app或Factory app, two OTA definitions,等熟悉了再自己写 CSV。
5. 常见问题与排查技巧实录
5.1 编译报错 "project.cmake not found"
这是最常见的错误,几乎每个新手都会遇到。原因就一个:CLion 不知道IDF_PATH在哪。
排查步骤:
- 确认 CMake options 里有没有
-DIDF_PATH=你的IDF路径。 - 确认路径写对了,没有多余空格,分隔符用的是
/或\\。 - 确认这个路径下确实有
tools/cmake/project.cmake文件。
如果都对了还报错,那可能是环境变量没注入。检查 CLion 启动时有没有继承 IDF 的环境变量,可以用launch_clion.bat的方式启动。
5.2 头文件能跳转但编译失败
这种情况通常是索引用的头文件路径和实际编译用的路径不一致。
CLion 的索引基于 CMake configure 的结果,如果 configure 时用的工具链和实际编译时不一样,就会出现"看得到但编不过"。
解决办法:在 CLion 里执行一次Tools -> CMake -> Reset Cache and Reload Project,强制重新 configure。如果还不行,检查 CMake profile 里的工具链文件是不是指向了正确的toolchain-esp32.cmake。
5.3 烧录时报 "Failed to connect to ESP32"
这个错误的原因很多,按概率排序:
- 串口被占用(最常见):关掉其他串口工具。
- 板子没进下载模式:有些板子需要按住 BOOT 键再按 RESET。
- 串口号选错:在设备管理器里确认。
- 驱动没装:CH340、CP2102 这些 USB 转串口芯片需要装驱动。
- 波特率太高:试试把烧录波特率降到 115200。
排查时建议从最简单的开始:先确认串口号,再确认驱动,最后才怀疑硬件。
5.4 CLion 索引卡死或内存占用过高
ESP-IDF 工程的头文件数量庞大,CLion 索引时可能吃掉几个 GB 内存。如果你的机器内存小于 16GB,可能会卡。
优化方法:
- 在
Settings -> Build, Execution, Deployment -> CMake里,把不用的构建类型删掉,只留一个。 - 在
Settings -> Editor -> File Types里,把build目录标记为 excluded,不让 CLion 索引编译产物。 - 增加 CLion 的堆内存:编辑
clion64.exe.vmoptions,把-Xmx调到 4096m 或更高。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 解决方向 |
|---|---|---|
| project.cmake not found | IDF_PATH 未设置 | 检查 CMake options |
| 头文件红色波浪线 | CMake configure 未完成 | 重新加载 CMake 项目 |
| 编译通过但烧录失败 | 串口占用或驱动问题 | 检查串口和驱动 |
| 索引卡死 | 内存不足或索引范围过大 | 排除 build 目录,加内存 |
| 工具链不匹配 | 目标芯片选错 | 检查 IDF_TARGET |
| Python 报错 | 环境变量指向错误 Python | 用 IDF 自带 Python |
5.6 几个我踩过的坑
第一个坑:在 CLion 里直接改sdkconfig不生效。sdkconfig是idf.py menuconfig生成的,如果你手动改,下次 menuconfig 可能会覆盖。正确做法是通过 menuconfig 改,或者改sdkconfig.defaults。
第二个坑:用 CLion 的 Run 按钮直接跑,结果跑的是宿主机程序而不是烧录。CLion 默认把 CMake 工程当成桌面程序,Run 按钮执行的是编译产物。对于嵌入式工程,你要么配置 External Tool,要么配置自定义的 Run Configuration,否则 Run 按钮没意义。
第三个坑:多版本 IDF 共存时环境变量串了。如果你装了 IDF 4.x 和 5.x,export 脚本会覆盖环境变量。切换版本时要重新执行对应版本的 export 脚本,不能混用。
第四个坑:路径里的反斜杠。Windows 习惯用\,但 CMake 和很多脚本里\是转义符。写路径时统一用/,能避免大量诡异问题。
6. 工具链版本管理与多目标芯片支持
6.1 多版本 IDF 的隔离方案
实际项目里,你很可能同时维护基于 IDF 4.4 的老项目和基于 IDF 5.x 的新项目。这两个版本的 API 有差异,工具链也不完全一样。
隔离方案有两种。第一种是装两份 IDF,用不同的 export 脚本切换。每个版本装在不同目录,需要哪个版本就执行哪个版本的 export。缺点是环境变量是全局的,切换时要小心。
第二种是用 CLion 的不同 CMake profile 绑定不同 IDF 路径。在 CLion 里建两个 profile,一个指向 IDF 4.4,一个指向 5.x,切换 profile 就切换了 IDF 版本。这种方式更干净,推荐使用。
具体做法是在 CMake options 里,每个 profile 写不同的-DIDF_PATH,工具链文件也指向对应版本的。这样两个项目可以同时打开,互不干扰。
6.2 ESP32、S3、C3 的差异处理
不同芯片的差异主要体现在三个方面:架构(Xtensa vs RISC-V)、工具链前缀、外设配置。
在 CLion 里切换目标芯片,核心是改IDF_TARGET这个 CMake 变量。改成esp32、esp32s3、esp32c3等,IDF 会自动选择对应的工具链和编译选项。
但要注意,切换 target 后要重新执行idf.py set-target,因为它会重新生成sdkconfig和构建配置。在 CLion 里,相当于要 reset CMake cache 再 reload。
另外,不同芯片的 Flash 大小、PSRAM 配置、分区表默认值都不同,切换后要检查 menuconfig 里的相关选项,别用错。
6.3 工具链路径的确认方法
如果你不确定工具链装在哪,可以在 IDF 命令行里执行:
idf.py --version echo %IDF_PATH% echo %IDF_TOOLS_PATH%IDF_TOOLS_PATH通常指向C:\Users\你的用户名\.espressif,工具链就在这个目录下的tools文件夹里。每个工具链有独立的子目录,比如xtensa-esp32-elf、riscv32-esp-elf。
在 CLion 的 CMake 配置里,工具链文件会自动处理这些路径,你一般不需要手动指定编译器。但如果遇到"找不到编译器"的错误,就要检查IDF_TOOLS_PATH是否正确,以及工具链目录是否存在。
7. 调试体验优化与日常使用建议
7.1 让代码补全更准的几个设置
CLion 默认的代码分析已经很不错,但针对 ESP-IDF 可以再优化。
第一,在Settings -> Editor -> Code Style -> C/C++里,把缩进设成 4 空格,和 IDF 官方风格一致,避免格式化时和团队代码冲突。
第二,在Settings -> Build, Execution, Deployment -> CMake里,勾选Automatically reload CMake project on editing,这样改了CMakeLists.txt后会自动重新 configure,不用手动点。
第三,把build目录和.git目录标记为 excluded,减少索引负担。右键目录 ->Mark Directory as->Excluded。
7.2 用 CLion 的重构功能管理大型工程
CLion 的重构能力是它相对 VS Code 的最大优势。比如你要把一个函数从main.c移到utils.c,用Refactor -> Move就能自动处理头文件引用和函数声明。改函数名用Shift+F6,所有调用点会同步更新。
对于 ESP-IDF 这种组件化工程,重构功能特别有用。你可以放心地重命名组件、移动文件,CLion 会帮你维护 CMake 里的依赖关系(前提是 CMake 配置正确)。
7.3 版本控制与 CLion 的集成
CLion 内置了 Git 支持,可以直接在 IDE 里提交、查看 diff、解决冲突。对于 ESP-IDF 工程,建议把build目录和sdkconfig加入.gitignore,因为它们是生成产物,不同机器上会不一样。
但sdkconfig.defaults要提交,它记录了项目的默认配置,是团队协作的基础。
7.4 日常使用的几个小技巧
- 用
Ctrl+Shift+A搜索任意操作,比翻菜单快。 - 用
Ctrl+E查看最近打开的文件。 - 用
Alt+1快速打开/关闭项目树。 - 用
Ctrl+Shift+F全局搜索,支持正则。 - 配置 External Tool 的快捷键,比如把 flash 绑到
Ctrl+Alt+F。
这套环境配好之后,日常开发效率会比原生 Eclipse 方案高一个档次。前期配置花的两三个小时,后面每天都能省回来。
8. 从配置到实战:一个完整的最小验证流程
8.1 端到端验证清单
配置完成后,用下面这个清单做一次完整验证,确保每个环节都通:
- CLion 能打开工程,CMake configure 无报错。
- 头文件能跳转,宏能展开,代码补全正常。
- 点编译能生成
.bin文件。 - External Tool 能烧录到板子。
- 串口监视器能看到板子输出。
- 改一行代码,重新编译烧录,行为变化符合预期。
这六步全过,说明环境彻底通了。任何一步卡住,回到对应章节排查。
8.2 一个可以抄的最小工程结构
my_project/ ├── CMakeLists.txt # 顶层,设置项目名和 IDF 路径 ├── sdkconfig # menuconfig 生成,不提交 ├── sdkconfig.defaults # 默认配置,提交 ├── main/ │ ├── CMakeLists.txt # 声明源文件和依赖组件 │ └── main.c # 入口 └── components/ # 自定义组件(可选) └── my_component/ ├── CMakeLists.txt ├── include/ └── my_component.c顶层CMakeLists.txt的核心内容:
cmake_minimum_required(VERSION 3.16) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(my_project)main/CMakeLists.txt:
idf_component_register(SRCS "main.c" INCLUDE_DIRS ".")这个结构是 ESP-IDF 的标准布局,CLion 能直接识别。你新建工程时,idf.py create-project生成的就是这个结构。
8.3 配置文件的备份与迁移
环境配好后,建议把关键配置备份下来,换机器时能快速恢复。需要备份的包括:
- CLion 的 CMake profile 配置(可以导出)
launch_clion.bat启动脚本- External Tool 的配置
sdkconfig.defaults
CLion 的配置存在用户目录下的.config或AppData里,具体路径因版本而异。更稳妥的做法是把这些配置写成文档,换机器时照着重新配一遍,比直接拷配置文件更可靠,因为路径可能不同。
9. 关于这套方案的边界与取舍
CLion 加 ESP-IDF 这套组合,不是没有代价的。它的主要短板在于:CLion 是商业软件,且对嵌入式调试的支持不如专门的嵌入式 IDE 深入。比如 JTAG 调试的配置就比较繁琐,不如一些专用工具开箱即用。
另外,CLion 的 CMake 集成虽然强大,但 ESP-IDF 的构建系统有自己的特殊性,两者对接时偶尔会有"水土不服",比如某些自定义 CMake 函数 CLion 解析不了,会误报错误。这些误报不影响实际编译,但看着烦。
所以我的建议是:如果你追求极致的代码编辑体验,且愿意花时间配置,CLion 方案值得投入;如果你更看重开箱即用和调试便利,VS Code 方案可能更合适。两者并不冲突,你完全可以日常用 CLion 写代码,调试时切到 VS Code 或命令行。
最后分享一个我自己的习惯:我会在项目根目录放一个README.md,记录这个项目的 IDF 版本、目标芯片、串口号、烧录命令。换机器或隔几个月回来,看一眼就知道怎么跑起来,不用重新回忆配置细节。这个习惯帮我省了很多重复排查的时间。