第四篇:交叉编译与工具链文件——一套代码,多个平台
前言前几篇文章我们写了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/8/17 15:44:44 阅读更多 →
构建下一代多模态深度研究智能体:从视频理解到主动推理

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

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

2026/8/16 6:23:56 阅读更多 →
TCP协议的三次握手与四次挥手详解

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

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

2026/8/19 19:24:59 阅读更多 →

最新新闻

3D建模布线核心技巧:从青铜狐面案例掌握游戏模型拓扑原理

3D建模布线核心技巧:从青铜狐面案例掌握游戏模型拓扑原理

你打开3D建模软件,面对一个复杂的游戏武器模型,是不是经常感觉无从下手?看着别人流畅的布线、精准的结构,自己却卡在基础形状上,或者布线一团乱麻,模型僵硬得像块石头。这感觉,就像拿到一张藏宝…

2026/8/21 4:37:43 阅读更多 →
VisualCppRedist AIO 使用指南:VC++运行库一键安装的终极方案,彻底告别 DLL 缺失报错

VisualCppRedist AIO 使用指南:VC++运行库一键安装的终极方案,彻底告别 DLL 缺失报错

VisualCppRedist AIO 使用指南:VC运行库一键安装的终极方案,彻底告别 DLL 缺失报错 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist Visua…

2026/8/21 4:37:43 阅读更多 →
VisualCppRedist AIO 运行库合集详解:3 分钟装齐 2005 到 2022 的 VC++ 运行库

VisualCppRedist AIO 运行库合集详解:3 分钟装齐 2005 到 2022 的 VC++ 运行库

VisualCppRedist AIO 运行库合集详解:3 分钟装齐 2005 到 2022 的 VC 运行库 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 玩游戏弹"MSVCP140…

2026/8/21 4:37:43 阅读更多 →
拖不动、拉不动、改不了:WindowResizer强制调整窗口大小,一个下午收拾服帖5类顽固软件

拖不动、拉不动、改不了:WindowResizer强制调整窗口大小,一个下午收拾服帖5类顽固软件

拖不动、拉不动、改不了:WindowResizer强制调整窗口大小,一个下午收拾服帖5类顽固软件 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer WindowResizer 是一款…

2026/8/21 4:37:43 阅读更多 →
变频PWM气动压力伺服系统Simulink完整仿真设计与实现

变频PWM气动压力伺服系统Simulink完整仿真设计与实现

简介:本项目基于Simulink平台构建变频PWM驱动的气动压力伺服控制系统仿真模型,融合变频调速、脉冲宽度调制(PWM)、气动动力学建模与闭环反馈控制理论。系统通过变频器调节压缩机/气源电机转速,结合PWM信号精确调控比例…

2026/8/21 4:37:43 阅读更多 →
算法时间复杂度:从概念到实战,掌握性能优化的核心

算法时间复杂度:从概念到实战,掌握性能优化的核心

1. 项目概述:为什么我们总在谈论时间复杂度?在算法和数据结构的世界里,无论你是准备面试的应届生,还是优化线上服务的资深工程师,有一个概念你永远绕不开,那就是“时间复杂度”。它不像具体的代码实现那样直…

2026/8/21 4:36:43 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/19 11:55:16 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/20 6:11:08 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →