2. 环境搭建:Windows/Linux/macOS下安装CMake、安装交叉编译工具链、验证安装

说实话,环境搭建这事儿,看着简单,但坑是真不少。我见过太多人卡在这一步,明明代码写得挺好,结果编译不过,最后发现是工具链没装对。咱们今天就把这事儿彻底捋清楚。

2.1 为什么环境搭建这么重要?

你想想看,嵌入式开发跟普通PC开发最大的区别在哪?

对,交叉编译。你的代码是在PC上写的,但最终要跑到ARM、RISC-V或者某个MCU上。这就意味着,你得在PC上装一套「能生成目标平台机器码」的工具链。CMake呢,就是帮你管理这套流程的管家。

核心概念:CMake本身不编译代码,它只是生成构建系统的配置文件(比如Makefile或Ninja文件)。真正的编译工作,由交叉编译工具链完成。

2.2 安装CMake——三个平台,一个套路

Windows下安装

我个人习惯用官方安装包。去cmake.org下载最新版,选那个 cmake-xxx-windows-x86_64.msi。安装时记得勾选「Add CMake to the system PATH for all users」——这一步很重要,不然你后面敲cmake命令会提示找不到。

小技巧:装完后打开命令行,敲 cmake --version。如果显示版本号,说明搞定了。我遇到过有人装完没重启终端,结果还是报错——其实重启一下就好了。

Linux下安装

Linux就简单多了。Ubuntu/Debian系:

sudo apt update
sudo apt install cmake

CentOS/RHEL/Fedora系:

sudo yum install cmake   # 老版本
sudo dnf install cmake   # 新版本

嗯,这里要注意:apt仓库里的cmake版本可能比较老。如果你需要最新版,我建议去cmake官网下载预编译的二进制包,解压后把bin目录加到PATH里就行。

macOS下安装

macOS用户直接用Homebrew:

brew install cmake

或者你也可以下载官方的 .dmg 安装包,拖到Applications里。装完后记得把 /Applications/CMake.app/Contents/bin 加到PATH里。

2.3 安装交叉编译工具链——这才是重头戏

CMake装好了,但如果没有交叉编译工具链,你什么都编译不了。说白了,工具链就是那个「翻译官」,把你的代码翻译成目标芯片能听懂的语言。

ARM GCC工具链

嵌入式里最常用的就是ARM GCC。我建议用 ARM官方的GNU Arm Embedded Toolchain。下载地址在ARM官网,选那个 gcc-arm-none-eabi-xxx 的包。

Windows用户下载 .exe 安装包,一路Next就行。Linux用户下载 .tar.bz2 包,解压到 /opt 目录:

sudo tar -xjf gcc-arm-none-eabi-xxx.tar.bz2 -C /opt/

然后配置环境变量:

export PATH=$PATH:/opt/gcc-arm-none-eabi-xxx/bin

我曾经犯过一个低级错误:解压后忘了加bin目录的路径,结果编译时一直报「arm-none-eabi-gcc: command not found」。折腾了半小时才发现是PATH没配好。所以,配完环境变量记得 source ~/.bashrc 或者重启终端。

其他常见工具链

目标平台 工具链名称 下载来源
ARM Cortex-M/R gcc-arm-none-eabi ARM官网
ARM Cortex-A arm-linux-gnueabihf-gcc Linaro或发行版仓库
RISC-V riscv64-unknown-elf-gcc RISC-V GNU工具链
ESP32 xtensa-esp32-elf-gcc 乐鑫官方

2.4 验证安装——别急着写代码

工具链装好了,怎么知道它能不能用?我一般会写一个最简单的测试程序。

先创建一个测试目录:

mkdir test_toolchain
cd test_toolchain

写一个 main.c

#include <stdio.h>

int main(void) {
    printf("Hello from ARM!\n");
    return 0;
}

然后手动编译试试:

arm-none-eabi-gcc -c main.c -o main.o

如果没报错,说明工具链能正常工作。接着写一个CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)
project(TestProject)

add_executable(test.elf main.c)

再写一个工具链文件 arm-none-eabi.cmake

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)

最后执行CMake配置:

mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../arm-none-eabi.cmake
make

验证要点:如果 make 后生成了 test.elf,说明整个环境已经打通了。你可以用 file test.elf 查看它是不是ARM格式的——如果是,恭喜你,环境搭建成功!

2.5 知识体系总览

下面这张图,把整个环境搭建的流程串起来了。我建议你保存下来,以后每次配新环境时对照着看。

嵌入式CMake环境搭建流程 Windows Linux macOS 安装 CMake(版本 ≥ 3.10) 安装交叉编译工具链(ARM/RISC-V/ESP32等) 验证:编写测试代码 → CMake配置 → 编译 → 检查输出

2.6 常见问题与避坑

  • 问题1:cmake命令找不到——检查PATH里有没有cmake的bin目录。Windows用户检查系统环境变量,Linux/macOS用户检查 ~/.bashrc~/.zshrc
  • 问题2:编译时报错「unknown target」——工具链没装对,或者CMake没找到工具链。检查 CMAKE_TOOLCHAIN_FILE 路径是否正确。
  • 问题3:生成了.elf文件但无法运行——正常,因为那是目标平台的格式,不能在PC上直接跑。用 file 命令确认格式即可。

我曾经在Windows上遇到过路径含中文导致编译失败的问题。CMake对中文路径支持不太好,建议所有路径都用英文,不要有空格和特殊字符。

好了,环境搭建就讲到这里。记住:工具链是地基,CMake是脚手架。地基没打好,后面盖楼全是白费功夫。动手试试吧,有问题随时翻回来看。


公众号:蓝海资料掘金营,微信deep3321