当前位置: 首页 > news >正文

搭建CMake+Ninja+GCC开发GD32

1.1 CMake Windows x64 MSI:

cmake-4.3.2-windows-x86_64.msi

1.2 Ninja 官方 GitHub Release

https://github.com/ninja-build/ninja/releases

解压到E:/Programs,这里路径,arm-none-eabi-gcc.cmake里面修改

1.3 gcc

https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
arm-gnu-toolchain-15.2.rel1-mingw-w64-x86_64-arm-none-eabi.zip
解压后,路径加入系统环境变量

1.4 验证

cmake--version
ninja--version

CMake + Ninja 工程说明

本工程使用 CMake 生成 Ninja 构建规则,再由 Ninja 调用 ARM GCC 编译固件。

整体关系如下:

CMakeLists.txt | v cmake -G Ninja | v build/build.ninja | v ninja | v TARGET_NAME.elf / TARGET_NAME.hex / TARGET_NAME.bin / TARGET_NAME.map

1. CMakeLists.txt 是什么

CMakeLists.txt是 CMake 工程的主配置文件。

它用来描述:

项目名称 使用的编程语言 源文件列表 头文件搜索路径 宏定义 CPU 编译参数 链接脚本 最终输出文件 构建后的转换动作

对于嵌入式工程,它通常还会配置:

MCU 内核参数,例如 cortex-m0plus 启动汇编文件 链接脚本 .ld objcopy 生成 .hex / .bin size 输出 Flash / RAM 占用

2. CMake、Ninja、GCC 的关系

三者分工不同:

CMake:读取 CMakeLists.txt,生成构建规则 Ninja:读取 build.ninja,执行具体编译命令 GCC:真正编译 C/ASM 文件并链接生成固件

也就是:

CMakeLists.txt --cmake--> build.ninja --ninja--> gcc 编译/链接

3. 为什么不直接手写 build.ninja

build.ninja通常不手写。

原因是:

Ninja 语法很简单,适合快速执行,不适合维护复杂工程逻辑 CMakeLists.txt 更适合描述跨平台工程结构 CMake 可以自动生成依赖关系和构建规则

所以推荐维护:

CMakeLists.txt

而不是维护:

build.ninja

4. toolchain 文件是什么

交叉编译时,CMake 需要知道使用哪一套编译器。

因此会单独准备一个 toolchain 文件,例如:

arm-none-eabi-gcc.cmake

它里面通常指定:

set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) set(TOOLCHAIN_DIR "E:/Programs/arm-gnu-toolchain/bin") set(CMAKE_C_COMPILER "${TOOLCHAIN_DIR}/arm-none-eabi-gcc.exe") set(CMAKE_ASM_COMPILER "${TOOLCHAIN_DIR}/arm-none-eabi-gcc.exe") set(CMAKE_OBJCOPY "${TOOLCHAIN_DIR}/arm-none-eabi-objcopy.exe") set(CMAKE_SIZE "${TOOLCHAIN_DIR}/arm-none-eabi-size.exe") set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

这样即使arm-none-eabi-gcc.exe没有加入系统 PATH,CMake 也能找到它。

5. 典型目录结构

推荐目录结构如下:

Project_ninja/ CMakeLists.txt arm-none-eabi-gcc.cmake startup_xxx_gcc.s target.ld build/ build.ninja TARGET_NAME.elf TARGET_NAME.hex TARGET_NAME.bin TARGET_NAME.map

其中:

CMakeLists.txt CMake 主配置文件 arm-none-eabi-gcc.cmake ARM GCC 工具链配置 startup_xxx_gcc.s MCU 启动文件 target.ld 链接脚本 build/ CMake/Ninja 构建输出目录

6. 配置工程

第一次构建前,需要先执行 CMake 配置:

cmake-S.\Project_ninja-B.\Project_ninja\build-G Ninja-DCMAKE_TOOLCHAIN_FILE=.\Project_ninja\arm-none-eabi-gcc.cmake

参数含义:

-S .\Project_ninja 指定源码目录,也就是 CMakeLists.txt 所在目录 -B .\Project_ninja\build 指定构建输出目录 -G Ninja 指定生成 Ninja 构建规则 -DCMAKE_TOOLCHAIN_FILE=... 指定 ARM GCC 工具链文件

配置成功后,会生成:

Project_ninja/build/build.ninja

7. 编译工程

配置完成后,执行:

cmake--build.\Project_ninja\build

或者进入 build 目录后直接执行:

ninja

构建成功后,通常会生成:

Project_ninja/build/TARGET_NAME.elf Project_ninja/build/TARGET_NAME.hex Project_ninja/build/TARGET_NAME.bin Project_ninja/build/TARGET_NAME.map

8. 清理工程

删除构建目录即可完整清理:

Remove-Item-Recurse-Force.\Project_ninja\build

然后重新配置:

cmake-S.\Project_ninja-B.\Project_ninja\build-G Ninja-DCMAKE_TOOLCHAIN_FILE=.\Project_ninja\arm-none-eabi-gcc.cmake

9. CMakeLists.txt 常见内容

一个嵌入式 CMake 工程通常包含:

cmake_minimum_required(VERSION 3.20) project(TARGET_NAME C ASM) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_EXTENSIONS OFF) set(TARGET_NAME target_name) set(ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/..) set(LINKER_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/target.ld)

源文件:

set(PROJECT_SOURCES ${ROOT_DIR}/User/main.c ${ROOT_DIR}/User/system_xxx.c ${CMAKE_CURRENT_LIST_DIR}/startup_xxx_gcc.s )

头文件路径:

target_include_directories(${TARGET_NAME}.elf PRIVATE ${ROOT_DIR}/User ${ROOT_DIR}/Drivers/CMSIS/Include )

宏定义:

target_compile_definitions(${TARGET_NAME}.elf PRIVATE MCU_MODEL USE_FULL_LL_DRIVER )

CPU 参数:

set(CPU_FLAGS -mcpu=cortex-m0plus -mthumb -mfloat-abi=soft )

编译参数:

target_compile_options(${TARGET_NAME}.elf PRIVATE ${CPU_FLAGS} -Os -g3 -Wall -Wextra -ffunction-sections -fdata-sections )

链接参数:

target_link_options(${TARGET_NAME}.elf PRIVATE ${CPU_FLAGS} -T${LINKER_SCRIPT} -Wl,-Map=${CMAKE_BINARY_DIR}/${TARGET_NAME}.map -Wl,--gc-sections -Wl,--print-memory-usage -specs=nano.specs -specs=nosys.specs -nostartfiles )

生成 HEX / BIN:

add_custom_command(TARGET ${TARGET_NAME}.elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} -O ihex $<TARGET_FILE:${TARGET_NAME}.elf> ${CMAKE_BINARY_DIR}/${TARGET_NAME}.hex COMMAND ${CMAKE_OBJCOPY} -O binary $<TARGET_FILE:${TARGET_NAME}.elf> ${CMAKE_BINARY_DIR}/${TARGET_NAME}.bin COMMAND ${CMAKE_SIZE} $<TARGET_FILE:${TARGET_NAME}.elf> )

10. 常见问题

cmake 找不到

确认 CMake 已加入 PATH。

验证:

cmake--version

ninja 找不到

确认ninja.exe所在目录已加入 PATH。

验证:

ninja--version

arm-none-eabi-gcc 找不到

如果 toolchain 文件中写了绝对路径,一般不需要加入 PATH。

检查路径是否正确:

E:/Programs/arm-gnu-toolchain/bin/arm-none-eabi-gcc.exe

修改了源文件列表后怎么办

重新构建即可:

cmake--build.\Project_ninja\build

如果改了 CMake 配置,建议重新配置一次:

cmake-S.\Project_ninja-B.\Project_ninja\build-G Ninja-DCMAKE_TOOLCHAIN_FILE=.\Project_ninja\arm-none-eabi-gcc.cmake

11. 推荐工作流

日常开发建议流程:

cmake-S.\Project_ninja-B.\Project_ninja\build-G Ninja-DCMAKE_TOOLCHAIN_FILE=.\Project_ninja\arm-none-eabi-gcc.cmake cmake--build.\Project_ninja\build

修改 C 文件后,只需要:

cmake--build.\Project_ninja\build

完全清理后重新构建:

Remove-Item-Recurse-Force.\Project_ninja\build cmake-S.\Project_ninja-B.\Project_ninja\build-G Ninja-DCMAKE_TOOLCHAIN_FILE=.\Project_ninja\arm-none-eabi-gcc.cmake cmake--build.\Project_ninja\build
http://www.cnnetsun.cn/news/2516038.html

相关文章:

  • Yolov8-pose关键点检测:CVPR2026 UCMNet |FrequencyCM赋能YOLO C2f:从频域增强视角解决感受野与细节瓶颈
  • 视频号视频下载去水印方法全是坑?全网视频一键拿捏!2026封神玩法!
  • 重磅首发|医学文献王Mac版+Office引用加载项同步上线,今晚直播解锁科研高效密码
  • Sora 2动态纹理流送与Unreal Niagara系统深度联调,GPU显存占用降低63%——一线影视工作室内部技术备忘录
  • DeepSeek V2 vs. DeepSeek-R1:参数冻结策略、LoRA适配层、量化精度损失的3维硬核对比
  • 【2024最新】ChatGPT SEO文章写作SOP:含关键词布局模板、EEAT强化话术、结构化Schema注入三步法
  • 【机密级部署白皮书首发】:DeepSeek-V2.5私有化集群在信创环境(鲲鹏920+统信UOS+达梦V8)的12小时极速上线实录
  • 产品经理核心能力,根本不是画原型
  • 终极指南:如何实现《塞尔达传说:旷野之息》Switch与WiiU存档无缝互通
  • Ender-3固件配置:从困惑到精通的完整指南
  • 大数据之安装HBase2.2.6
  • 终极指南:快速完整破解Cursor Pro限制的免费工具
  • Mac Mouse Fix完整指南:让你的普通鼠标变身专业级Mac输入设备
  • AI智能切片不是‘一键分割’就完事:批量口播视频的工程化切片陷阱与工具选型
  • 2026年AI工具格局不会由算法决定,而由这4个非技术变量主导:合规审计周期、客户LTV/CAC比值、模型即服务SLA违约金条款、边缘推理延迟容忍阈值
  • OFC求解工具横评—5款Pineapple EV实测
  • 互联网招聘独角兽拉勾网破产,AI浪潮下在线招聘赛道竞争正当时
  • 企业级Agent架构实战:竞争情报来源分散,无法系统化整理分析怎么办?
  • NVIDIA Profile Inspector完全指南:解锁显卡700+隐藏设置,游戏性能提升30%
  • 观察Taotoken在高峰时段的请求成功率与路由稳定性
  • Esp32Robot入门05-大模型接口对接与配置(实战进阶:对接Qwen3.6-35B本地大模型与API配置实战)
  • 360浏览器隐私怎么清理?【图文讲解】360浏览器缓存清理?360浏览器上网痕迹清除?浏览器删除Cookie密码?共用电脑隐私清理?
  • 独立开发者如何管理多个项目的API Key与访问权限
  • 通过Taotoken审计日志功能追踪团队API使用情况的实际案例
  • 为内容生成平台集成多模型API以满足多样化的创作需求
  • 小程序怎么制作工具?与其盲目找开发,不如先分清自己要哪一种
  • Spring Data Redis 实战避坑:搞定序列化乱码与 Hash 结构存储
  • pygame库
  • 矿用电机车运行参数保护系统,让井下轨道运输更安全
  • 主产区安全整改深化 行业加速洗牌(5 月 21 日)