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 本章知识体系总览
为了让你更直观地理解本章的内容结构,我画了一张流程图:
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 命令参数,本地使用无需指定端口 |