CLion 本身不自带交叉编译能力,必须显式配置工具链并联动 CMake 才能生成 ARM Cortex-M 等目标平台的二进制代码;漏配任一环节(如未设 CMake_SYSTEM_NAME、未绑定工具链或未验证 arm-none-eabi-gcc 可执行),CMake 就默认调用宿主机 gcc,导致“能编过但跑不起来”。

CLion 本身不自带交叉编译能力,必须显式配置工具链并联动 CMake 才能生成目标平台(比如 ARM Cortex-M)的二进制代码。漏配或错配任意一环,cmake 就会默认用宿主机 gcc 编译,结果是「能编过,但跑不起来」。
确认 arm-none-eabi-gcc 已就位且可调用
这是所有后续操作的前提。CLion 不会帮你装工具链,只负责调用。
- 在终端运行
arm-none-eabi-gcc --version,必须有输出;否则 CMake Profile 里填了路径也白搭 - 推荐路径:Linux/macOS 放
/opt/gnu-arm-toolchain/bin,Windows 放C:\gnu-arm\bin,然后加进系统PATH - 别用 MinGW 或 WSL 默认
gcc冒充 —— 它们生成的是 x86/x64 ELF,不是 ARM Thumb 指令
在 Toolchains 设置页手动指定交叉编译器
CLion 的「自动检测」在交叉场景下基本不可信,必须手填绝对路径。
- 进入
Settings > Build, Execution, Deployment > Toolchains - 点
+添加新工具链,类型选Embedded Development(新版 UI)或直接填路径(旧版) -
C Compiler填/opt/gnu-arm-toolchain/bin/arm-none-eabi-gcc(Linux/macOS)或C:\gnu-arm\bin\arm-none-eabi-gcc.exe(Windows) -
C++ Compiler填对应arm-none-eabi-g++,Debugger填arm-none-eabi-gdb - 别勾选「Auto-detect」——它大概率找到的是系统
gdb,不是带-none-eabi-后缀的那个
CMake Profile 必须绑定该工具链并传入平台参数
只配 Toolchains 不够,CMake 不知道你要交叉编译,仍会走 host-native 流程。
- 进
Settings > Build, Execution, Deployment > CMake - 新增 Profile,
Toolchain下拉选你刚建的那个 ARM 工具链 -
CMake options里必须加这三行:-DCMAKE_SYSTEM_NAME=Generic-DCMAKE_SYSTEM_PROCESSOR=ARM-DCMAKE_C_COMPILER=arm-none-eabi-gcc - 如果项目用 Pico SDK,还得在
Environment variables里加PICO_SDK_PATH=/path/to/pico-sdk - 删掉
-G "MinGW Makefiles"这类宿主构建后端参数,让 CMake 自动选 Ninja 或 Unix Makefiles
验证是否真在交叉编译
最直接的办法不是看有没有报错,而是看输出文件的架构和符号表。
- 编译完检查
build/<project>/CMakeFiles/<target>.dir/link.txt</target></project>,第一行是否含arm-none-eabi-gcc - 运行
file build/<project>/<target>.elf</target></project>,输出应为ELF 32-bit LSB executable, ARM, EABI5,不是x86-64 - 若出现
error while loading shared libraries: libstdc++.so.6,说明链接时混用了 host 的libstdc++,要检查CMAKE_CXX_FLAGS是否加了--static-libstdc++
最容易被忽略的是 CMake Cache 残留:改完 Toolchain 和 CMake options 后,必须点 Reload CMake project(不是重开窗口),否则 CLion 会继续用旧缓存里的 host 编译器路径。


















