2、构建环境准备:安装交叉编译工具链、配置必要的系统工具、设置环境变量

做嵌入式开发,第一件事就是把环境搭好。这事看起来简单,但我在项目里见过太多人因为工具链版本不对、环境变量没配好,白白浪费一整天。说白了,环境准备就像盖楼打地基——地基歪了,后面全白干。

这一章,我们就来把交叉编译工具链、系统工具和环境变量一次性搞定。

2.1 交叉编译工具链:为什么需要它?

你想想看,你的开发机是 x86 架构,但目标板可能是 ARM、RISC-V 或者 MIPS。x86 上编译出来的程序,ARM 板子根本跑不了。这时候就需要交叉编译工具链——它能在你的 x86 机器上生成目标架构的可执行文件。

我个人习惯用 Linaro 提供的 GCC 工具链,稳定且社区活跃。当然,你也可以用芯片厂商提供的定制版,比如 ARM 的 arm-none-eabi-gcc 或者 RISC-V 的 riscv64-unknown-linux-gnu-gcc。

核心概念:交叉编译工具链 = 编译器 + 链接器 + 库 + 调试器。它们都带有目标架构前缀,比如 arm-linux-gnueabihf-gcc。

2.2 安装交叉编译工具链

这里我以 ARM 架构为例,演示完整的安装流程。其他架构大同小异,你换一下下载链接就行。

2.2.1 下载并解压

我建议把工具链统一放在 /opt/toolchains 目录下,方便管理。

# 创建工具链目录
sudo mkdir -p /opt/toolchains
cd /opt/toolchains

# 下载 ARM GCC 工具链(以 gcc-arm-10.3-2021.07 为例)
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz

# 解压
sudo tar -xf gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf.tar.xz

# 解压后目录结构
ls /opt/toolchains/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/
# bin/  include/  lib/  libexec/  share/

我的经验:下载前先确认目标板的架构和浮点类型。比如 Cortex-A7 通常用 arm-linux-gnueabihf(硬浮点),而 Cortex-M 系列用 arm-none-eabi(裸机)。选错了,编译出来的程序可能跑不起来。

2.2.2 验证安装

解压完成后,先检查一下编译器能否正常工作。

# 查看编译器版本
/opt/toolchains/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-gcc --version

# 输出示例
arm-none-linux-gnueabihf-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07) 10.3.1 20210621
Copyright (C) 2020 Free Software Foundation, Inc.

看到版本号就说明安装成功了。如果提示 No such file or directory,大概率是下载的架构不对(比如下载了 32 位版本但你的系统是 64 位)。

避坑指南:我曾经在 Ubuntu 20.04 上遇到过 libncurses.so.5 缺失的问题。这是因为较新的系统默认只带了 libncurses6。解决办法:sudo apt install libncurses5。如果你也遇到类似报错,先检查依赖库。

2.3 配置必要的系统工具

除了工具链,还有几个工具是 SDK 发布过程中必不可少的。我把它们列在下面:

工具 用途 安装命令
make 构建系统,控制编译流程 sudo apt install make
rsync 高效文件同步,用于打包根文件系统 sudo apt install rsync
fakeroot 模拟 root 权限,用于创建文件系统时保留文件属主和权限 sudo apt install fakeroot

这三个工具,我建议你一次性装好:

sudo apt update
sudo apt install make rsync fakeroot -y

装完之后,验证一下:

make --version
rsync --version
fakeroot --version

每个命令都能正常输出版本信息,就说明环境没问题。

为什么需要 fakeroot? 构建根文件系统时,很多文件需要属于 root 用户,比如 /bin/busybox 的权限是 -rwsr-xr-x。普通用户无法直接设置这些权限,但 fakeroot 可以模拟 root 环境,让你在打包阶段「假装」自己是 root。等文件系统烧录到目标板后,真实的 root 权限就生效了。

2.4 设置环境变量

工具链装好了,但每次都要输入一长串路径才能调用编译器,太麻烦了。我们需要把工具链路径加到环境变量里,让系统能自动找到它。

2.4.1 临时设置(当前终端有效)

export PATH=/opt/toolchains/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin:$PATH
export CROSS_COMPILE=arm-none-linux-gnueabihf-
export ARCH=arm

设置完后,直接输入 arm-none-linux-gnueabihf-gcc 就能调用编译器了。

2.4.2 永久设置(推荐)

我个人习惯把环境变量写在 ~/.bashrc 里,这样每次打开终端都自动生效。

# 编辑 ~/.bashrc
vim ~/.bashrc

# 在文件末尾添加以下内容
export PATH=/opt/toolchains/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin:$PATH
export CROSS_COMPILE=arm-none-linux-gnueabihf-
export ARCH=arm

# 保存退出后,使配置生效
source ~/.bashrc

环境变量说明:

  • PATH:告诉系统去哪里找可执行文件。
  • CROSS_COMPILE:指定交叉编译器的前缀。很多构建系统(如 Linux 内核、Buildroot)会自动读取这个变量。
  • ARCH:指定目标架构。内核编译时用这个变量来决定使用哪个架构的代码。

2.4.3 验证环境变量

# 检查 PATH 是否包含工具链路径
echo $PATH | grep arm

# 检查 CROSS_COMPILE
echo $CROSS_COMPILE
# 输出:arm-none-linux-gnueabihf-

# 检查 ARCH
echo $ARCH
# 输出:arm

如果都能正确输出,说明环境变量配置成功。

避坑指南:我曾经犯过一个低级错误——把 PATH 写成了 PATH=/opt/...:$PATH 但漏掉了 export。结果子进程根本拿不到这个变量,编译时一直报 command not found。记住:export 是必须的,它让变量从 shell 传递到子进程。

2.5 本章知识体系总览

为了让你更直观地理解本章的内容结构,我画了一张流程图:

构建环境准备知识体系 构建环境准备 交叉编译工具链 系统工具安装 环境变量配置 下载解压 验证安装 make rsync fakeroot 临时设置 永久设置 核心要点 • 工具链版本必须与目标架构匹配(ARM/RISC-V/MIPS) • 系统工具 make + rsync + fakeroot 缺一不可 • 环境变量 PATH / CROSS_COMPILE / ARCH 必须正确导出

2.6 常见问题与排查

环境搭建过程中,你可能会遇到下面这些问题。我把它们列出来,方便你对照排查:

问题现象 可能原因 解决办法
arm-none-linux-gnueabihf-gcc: command not found PATH 未包含工具链路径,或路径写错了 检查 echo $PATH,确认路径是否存在
fakeroot: command not found fakeroot 未安装 sudo apt install fakeroot
编译时提示 cannot execute binary file 工具链架构与系统不匹配(如 32 位工具链跑在 64 位系统上) 下载对应架构的版本,或安装 lib32z1 兼容库
rsync: connection refused rsync 目标地址或端口配置错误 检查 rsync 命令参数,本地使用无需指定端口