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 知识体系总览
下面这张图,把整个环境搭建的流程串起来了。我建议你保存下来,以后每次配新环境时对照着看。
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