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

相关新闻

最新新闻

从设备联网到空间理解,慢云重新定义智慧空间的技术逻辑

从设备联网到空间理解,慢云重新定义智慧空间的技术逻辑

空间AI的落地难点,从来不是让更多设备连上网。很多项目部署了大量智能门锁、照明、空调和传感器,却依然停留在“设备各自响应指令”的阶段:断网时部分功能失效,云端指令延迟影响体验,跨设备联动需要反复调试&#xff0…

2026/8/16 7:08:56
静态路由配置实战:解决内外网冲突,实现双网卡并行访问

静态路由配置实战:解决内外网冲突,实现双网卡并行访问

1. 项目概述:一个看似简单却常被忽视的网络优化方案在任何一个稍微有点规模的办公环境或者家庭网络里,你很可能遇到过这样的场景:电脑连着公司的有线内网,同时又连着Wi-Fi上外网,结果发现要么内网资源访问不了&#xf…

2026/8/16 7:08:56
电路分析与模拟电路实验箱

电路分析与模拟电路实验箱

1、电源:输入AC 220V/50Hz 10%; 输出DC 12V/0.5A、DC -12V/0.5A两组,带有示波器接地环。 2、可调电源:可调电源A DC 10V~20V(0.5A)、0~10V(0.5A); 可调电源B DC 1.25V~15V(0.5A)、DC -1.25V&…

2026/8/16 7:08:56
论文低分元凶找到了[特殊字符]Paperxie科研绘图|5分钟搞定学术高清插图

论文低分元凶找到了[特殊字符]Paperxie科研绘图|5分钟搞定学术高清插图

很多同学论文内容写得再好,最终分数还是上不去! 最大短板根本不是查重和语句,而是图表太粗糙、配图不学术、没有可视化逻辑🙅♀️ 理工科要画流程图、机制图、结构模型,文科要做研究框架、调研导图,还要处…

2026/8/16 7:08:56
【无人机通信】一个‌移动无人机(UAV)自组网连通性仿真系统‌,模拟动态无人机网络,并评估无人机群与地面控制站(GCS)之间的连接稳定性MATLAB代码

【无人机通信】一个‌移动无人机(UAV)自组网连通性仿真系统‌,模拟动态无人机网络,并评估无人机群与地面控制站(GCS)之间的连接稳定性MATLAB代码

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

2026/8/16 7:08:56
双指针(内含单调栈,滑动窗口)

双指针(内含单调栈,滑动窗口)

双指针(two‑pointer) 双指针:用两个变量代表两个下标,不嵌套两层循环,把 O(n2)O(n^2)O(n2) 优化到 (O(n))。 分为两大类:对撞双指针、滑动窗口(快慢指针)。 一、两种双指针模型 1.…

2026/8/16 7:03:56