下面是 CMake 和 PlatformIO 构建项目方式的详细对比,从项目结构、配置方式、构建流程、适用场景、优缺点等多个维度说明它们的异同:
🧱 1. 📁 项目结构对比
🔧 CMake 项目结构(通用 C++ / 嵌入式也可)
MyProject/
├── CMakeLists.txt
├── src/
│ └── main.cpp
├── include/
│ └── myheader.h
├── build/
└── toolchain.cmake # 仅嵌入式用
🔌 PlatformIO 项目结构(嵌入式)
MyPIOProject/
├── platformio.ini
├── src/
│ └── main.cpp
├── include/
│ └── myheader.h
├── lib/
│ └── custom_lib/
├── .pio/
└── .vscode/
⚙️ 2. 构建配置方式
对比项 | CMake | PlatformIO |
---|
配置文件 | CMakeLists.txt (脚本语言) | platformio.ini (INI格式) |
工具链设置 | 手动指定 toolchain.cmake 或环境变量 | 自动内置并识别开发板对应工具链 |
添加源文件 | file(GLOB ...) 或手动列表 | 默认编译 src/ 下所有文件 |
添加库 | target_link_libraries() 等 | lib_deps 或 lib/ 目录自动加载 |
串口烧录/上传 | 需自写脚本/调用外部工具 | 内置烧录逻辑,支持 upload 命令 |
调试支持 | 需自建 GDB + OpenOCD 环境 | 自带调试器支持(取决于开发板) |
支持平台 | 全平台,包括 Linux/Windows/macOS/嵌入式 | 主要为嵌入式(ESP32、STM32、Arduino 等) |
🚀 3. 构建 & 上传命令对比
操作 | CMake 命令 | PlatformIO 命令 |
---|
配置项目 | cmake .. | 自动完成,无需额外配置 |
编译项目 | cmake --build . 或 make | platformio run |
上传固件 | ❌ 需手动调用工具(如 esptool.py ) | ✅ platformio run --target upload |
打开串口监视 | ❌ 手动打开 minicom / screen | ✅ platformio device monitor |
添加库 | 自己下载、解压、link | 自动通过库管理器 |
📦 4. 库管理方式
特性 | CMake | PlatformIO |
---|
官方库支持 | ❌ 无内建库管理 | ✅ 内建数千个库 |
添加外部库 | 通过 FetchContent 或 add_subdirectory | lib_deps = 库名 |
私有库 | 手动管理(如 Git 子模块) | 放入 lib/ 或通过 Git/URL 安装 |
🔬 5. 示例项目构建差异
🔧 用 CMake 构建
mkdir build
cd build
cmake ..
make
./MyProject
🔌 用 PlatformIO 构建并上传(适用于 MCU)
platformio run
platformio run --target upload
platformio device monitor
✅ 6. 适用场景对比总结
场景 | 推荐工具 | 原因 |
---|
桌面应用(Linux/Windows) | ✅ CMake | 灵活支持多平台,通用构建系统 |
跨平台库开发 | ✅ CMake | 支持静态/动态库构建,容易集成 |
简单 Arduino / ESP32 项目 | ✅ PlatformIO | 快速开发,封装上传、串口监控、库管理等 |
复杂嵌入式系统(RTOS、HAL) | ✅ CMake (高级) | 灵活性高但更复杂,需要手动设置工具链和链接脚本 |
快速集成第三方库 | ✅ PlatformIO | 一行配置即可添加,适合原型设计 |
🟡 7. 优缺点总结
工具 | 优点 | 缺点 |
---|
CMake | 灵活强大,通用于任何项目类型;支持复杂构建逻辑;跨平台 | 上手略难,嵌入式使用需手动设置工具链和上传流程 |
PlatformIO | 快速上手;一键构建上传调试;内建库管理器;支持 VSCode 插件 | 较封闭,不适合非嵌入式项目;某些定制构建流程不如 CMake 灵活 |
PlatformIO 很难修改工具链和链接文件(pio run 会根据你的paltform bord framework 配置自动去调用)。另外,用的库如果需要修改需要复制到lib中。
🎯 结论
- 想做桌面/跨平台项目 → ✅ 用 CMake
- 想做ESP32 / Arduino 嵌入式项目 → ✅ 用 PlatformIO
- STM32 CMSIS/HAL 项目推荐使用STMCubeMX生成的CubeIDE项目(CMake)
- 想做可维护的大型嵌入式项目,但不依赖 PlatformIO → ✅ 可选 CMake + 手动上传脚本