尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
第四篇:交叉编译与工具链文件——一套代码,多个平台
前言前几篇文章我们写了CMakeLists.txt但里面有一些硬编码的内容arm-none-eabi-gcc编译器名称-mcpucortex-m3CPU 型号stm32f103.ld链接脚本如果换一个芯片比如从 STM32F103 换到 STM32F407这些内容都要改。有没有办法让 CMakeLists.txt 完全不用动只改一个文件就能切换芯片呢答案是工具链文件Toolchain File。 一、什么是交叉编译在继续之前先理解一个概念交叉编译。本地编译在 PC 上编译在 PC 上运行比如你用 VS Code 写了一个 Hello World在电脑上运行交叉编译在 PC 上编译在另一个平台上运行比如在 PC 上编译出单片机可以运行的机器码单片机开发就是典型的交叉编译。我们需要告诉 CMake编译器不是系统的gcc而是arm-none-eabi-gcc目标系统不是 Windows/Linux而是裸机编译选项要根据芯片型号来定这些信息都可以放在工具链文件里。 二、工具链文件长什么样工具链文件本质上就是一个 CMake 脚本里面set()了一系列变量。cmake/arm-none-eabi-gcc.cmake# # 工具链文件ARM GCC 交叉编译配置 # # 1. 目标系统 set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) # 2. 编译器 set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_CXX_COMPILER arm-none-eabi-g) set(CMAKE_ASM_COMPILER arm-none-eabi-gcc) # 3. 编译选项可由用户覆盖 set(MCU_FLAGS -mcpucortex-m3 -mthumb) set(CMAKE_C_FLAGS ${MCU_FLAGS} -Wall -Wextra -stdc11 CACHE STRING FORCE) set(CMAKE_CXX_FLAGS ${MCU_FLAGS} -Wall -Wextra -stdc14 CACHE STRING FORCE) set(CMAKE_ASM_FLAGS ${MCU_FLAGS} CACHE STRING FORCE) set(CMAKE_EXE_LINKER_FLAGS ${MCU_FLAGS} -T ${CMAKE_SOURCE_DIR}/stm32f103.ld CACHE STRING FORCE) # 4. 调试信息 set(CMAKE_C_FLAGS_DEBUG -O0 -g3 CACHE STRING FORCE) set(CMAKE_C_FLAGS_RELEASE -Os CACHE STRING FORCE)注意CACHE STRING FORCE的写法它让这些变量可以被用户在命令行覆盖。 三、如何使用工具链文件使用工具链文件非常简单在cmake配置时通过-DCMAKE_TOOLCHAIN_FILE参数指定cmake -B build -DCMAKE_TOOLCHAIN_FILEcmake/arm-none-eabi-gcc.cmake cmake --build build如果你的工程支持多个芯片平台可以准备多个工具链文件cmake/ ├── arm-none-eabi-gcc-stm32f1.cmake # STM32F1 ├── arm-none-eabi-gcc-stm32f4.cmake # STM32F4 ├── arm-none-eabi-gcc-stm32l4.cmake # STM32L4 └── esp32.cmake # ESP32切换芯片只需要换一个工具链文件。CMakeLists.txt 完全不用动。 四、实战同一份代码编译到不同芯片4.1 项目结构my_firmware/ ├── CMakeLists.txt # 一份完全不用动 ├── cmake/ │ ├── stm32f103.cmake # STM32F103 工具链 │ └── stm32f407.cmake # STM32F407 工具链 ├── src/ │ └── main.c # 一份完全不用动 └── ld/ ├── stm32f103.ld # F103 链接脚本 └── stm32f407.ld # F407 链接脚本4.2 CMakeLists.txt不再包含硬件相关的硬编码cmake_minimum_required(VERSION 3.20) project(MyFirmware C ASM) # 编译选项和链接脚本都在工具链文件中定义 # CMakeLists.txt 只关注“有哪些源文件” add_executable(my_firmware src/main.c src/system.c ) target_include_directories(my_firmware PRIVATE inc/ drivers/inc/ )4.3 编译到 STM32F103cmake -B build_f103 -DCMAKE_TOOLCHAIN_FILEcmake/stm32f103.cmake cmake --build build_f1034.4 编译到 STM32F407cmake -B build_f407 -DCMAKE_TOOLCHAIN_FILEcmake/stm32f407.cmake cmake --build build_f407同一份代码同一个 CMakeLists.txt两个不同的芯片两套独立的编译产物。⚙️ 五、CMake Presets更优雅的切换方式如果你的项目支持多个平台每次都要输入长长的命令有点麻烦。CMake 3.19 支持CMake Presets可以把配置写在CMakePresets.json里。CMakePresets.json{ version: 3, configurePresets: [ { name: stm32f103, displayName: STM32F103, generator: Ninja, binaryDir: ${sourceDir}/build_f103, cacheVariables: { CMAKE_TOOLCHAIN_FILE: ${sourceDir}/cmake/stm32f103.cmake } }, { name: stm32f407, displayName: STM32F407, generator: Ninja, binaryDir: ${sourceDir}/build_f407, cacheVariables: { CMAKE_TOOLCHAIN_FILE: ${sourceDir}/cmake/stm32f407.cmake } } ] }之后只需要cmake --preset stm32f103 cmake --build build_f103 六、总结工具链文件的核心价值把“硬件相关”的配置从 CMakeLists.txt 中抽离出来。放在 CMakeLists.txt 中放在工具链文件中项目名称编译器路径源文件列表CPU 型号头文件路径编译选项模块依赖链接脚本这样做的好处CMakeLists.txt 只关注“代码组织”不关注“硬件差异”换芯片 换工具链文件业务代码完全不动同一份代码可以在 CI 中并行编译到多个平台
RELATED

相关推荐

数据结构中串的存储与KMP模式匹配算法详解

数据结构中串的存储与KMP模式匹配算法详解

1. 串:被低估的线性结构基石在数据结构的学习路径上,我们习惯了数组的随机访问、链表的灵活增删,但有一个结构,它无处不在,却又常常被初学者一带而过,那就是“串”。很多人觉得,串不就是字符数组…

📅 2026/9/10 22:24:34
小程序体积优化实战:从2M到1.2M的瘦身策略与工程实践

小程序体积优化实战:从2M到1.2M的瘦身策略与工程实践

1. 项目概述:小程序体积膨胀的“隐形杀手”最近在帮团队优化一个迭代了两年多的微信小程序,主包体积一路飙升到了接近2M的警戒线,分包加载也慢得让人心焦。这几乎是所有中大型小程序开发者都会遇到的“成长的烦恼”。小程序打包体积过大&…

📅 2026/9/11 14:58:05
ESP32智能小车实战:从零实现循迹、避障与跟随功能

ESP32智能小车实战:从零实现循迹、避障与跟随功能

这次我们来看一个基于 ESP32 的智能小车项目,它集成了循迹、避障和跟随三大核心功能。这个项目不是停留在概念阶段,而是提供了完整的硬件清单、接线图和 Arduino 代码,让你能从零开始搭建一个真正能跑起来的智能移动平台。对于想入门嵌入式、…

📅 2026/10/5 7:50:58
MORE NEWS

更多资讯

📰

Livenerf: Has Opus 5.5 been nerfed yet?

从今天觉醒,技术赋予每一个人数字生命Livenerf: Has Opus 5.5 been nerfed yet?① 技术背景:为什么“模型是否被削弱”成了工程问题 大模型应用进入深水区后,一个微妙但普遍的焦虑出现了:同一个模型,上周还能稳定完成的任务&…

📰

2027年新疆职业院校技能大赛(高职组)移动应用设计与开发赛项样题

2027年新疆职业院校技能大赛(高职组)移动应用设计与开发赛项样题 文章目录2027年新疆职业院校技能大赛(高职组)移动应用设计与开发赛项样题任务一 产品原型设计任务 1:绘制“生态环保首页”模块界面原型(6分…

📰

后台管理静态模板:HTML+CSS+原生JS搭建与避坑指南

简介:这是一套面向企业后台与网站管理系统开发者的中文版HTML后台管理静态模板,适合前端初学者、全栈开发者及需要快速搭建管理界面的项目团队使用。模板预置了登录、首页、品牌管理、产品列表、订单表单、权限控制、用户列表、广告管理、管理员设置等常…

📰

继电器与接触器:从原理到选型,避开电气控制中的那些坑

1. 从两个让人头疼的现场故障说起刚入行那会儿,我在一个自动化产线上做调试。有天半夜接到电话,说一台包装机“抽风”了——按下启动按钮,电机嗡嗡响两声就停,反复几次之后,控制柜里冒出一股淡淡的焦糊味。赶到现场打开…

📰

SAVD空间自适应校正:VR视觉误差的硬核工程解法

1. 项目概述:为什么VR图像误差校正不是“调个参数”就能解决的事我第一次在某高校实验室调试VR头显时,被一个现象卡了整整三天——用户左右平移头部时,虚拟物体边缘出现肉眼可见的“撕裂感”,不是延迟高,也不是帧率低&…

📰

校园线上超市小程序源码拆解:从业务模型到二次开发实践

记得第一次拿到这类“可白嫖源码”的校园线上超市平台项目,我的操作和大多数人一样:解压、打开微信开发者工具、导入、然后坐等报错。等我把页面加载出来、点了几下能正常跳转之后,才意识到自己对这套系统的理解还停留在“能跑”的阶段。项目…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬