第四篇:交叉编译与工具链文件——一套代码,多个平台
前言前几篇文章我们写了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 中并行编译到多个平台

相关新闻

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

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

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

2026/10/1 22:11:25 阅读更多 →
构建下一代多模态深度研究智能体:从视频理解到主动推理

构建下一代多模态深度研究智能体:从视频理解到主动推理

1. 项目概述:从“看视频”到“研究视频”的范式跃迁最近在折腾一个挺有意思的项目,我把它叫做“Video-DeepResearch”。这个名字听起来有点唬人,但核心想法其实很直接:我们能不能让AI不仅“看懂”视频里有什么,还能像一…

2026/9/28 10:18:04 阅读更多 →
TCP协议的三次握手与四次挥手详解

TCP协议的三次握手与四次挥手详解

1. TCP协议的核心礼仪:连接与断开的艺术在网络通信的世界里,TCP协议就像一位彬彬有礼的绅士,每一次数据交互都遵循着严格的礼仪规范。这种"礼仪"不是多余的客套,而是确保数据可靠传输的关键机制。想象一下两位外交官在重…

2026/10/10 3:09:13 阅读更多 →

最新新闻

基于MATLAB手写MPC的车辆轨迹跟踪仿真与调参实践

基于MATLAB手写MPC的车辆轨迹跟踪仿真与调参实践

1. 为什么选择MPC做轨迹跟踪1.1 轨迹跟踪问题的本质做车辆控制的人都知道,轨迹跟踪这个课题的核心,不是“让车走到某个点”,而是让车辆沿着一条预先给定的路径曲线,在满足横纵向运动约束的前提下,尽可能精确地贴住目标…

2026/10/11 5:44:51 阅读更多 →
Linux日志服务器配置指南

Linux日志服务器配置指南

Linux服务器配置教程 以下内容涵盖了 Linux 服务器 的常见配置方法,包括 日志服务器配置、基础环境设置、Anaconda 和 PyTorch 环境搭建、Samba 文件共享 以及 Nginx Web 服务器安装与配置。 1. Linux 日志服务器配置 Linux 系统中,rsyslog 是默认的日…

2026/10/11 5:44:51 阅读更多 →
Buzz 离线转写实操:两小时会议录音,本地出字幕

Buzz 离线转写实操:两小时会议录音,本地出字幕

Buzz 离线转写实操:两小时会议录音,本地出字幕 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 开会录…

2026/10/11 5:44:51 阅读更多 →
数学建模竞赛备赛全攻略:从建模论文写作到华数杯国际赛实战技巧

数学建模竞赛备赛全攻略:从建模论文写作到华数杯国际赛实战技巧

我参加过几届数学建模竞赛,也带过学校里的队伍备赛,所以当“2026华数杯国际赛全包来啦”这种广告语出现在各个群里的时候,我第一反应不是心动,而是摇头。“全包”这两个字,确实抓住了参赛者的焦虑:怕三天写…

2026/10/11 5:44:51 阅读更多 →
在线字符数统计工具核心实现:从length到Intl.Segmenter

在线字符数统计工具核心实现:从length到Intl.Segmenter

做在线工具站这几年,我手里留存率最高的一个工具,反而是当初最没当回事儿的那个——文本字符数统计。代码核心就几十行,但后台数据显示每天有上千人使用。这个工具解决的需求其实很基础:写公众号、小红书、论文、简历,…

2026/10/11 5:44:51 阅读更多 →
Linux pinctrl 和 GPIO 子系统

Linux pinctrl 和 GPIO 子系统

一、先建立整体认识 一个芯片引脚通常不是固定用途。同一个物理引脚可能支持 GPIO、UART_TX、SPI_MOSI、I2C_SDA 或 PWM 等功能。 使用一个引脚时,通常要解决两个问题: 这个引脚应该连接到哪个硬件功能?如果它作为 GPIO 使用,应该…

2026/10/11 5:43:51 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →