2. 编译环境搭建
好,咱们正式开始动手了。这一章要解决的是「工欲善其事,必先利其器」的问题。说白了,就是让你的电脑能编译 U-Boot。
很多新手在这一步就卡住了——不是装错工具链版本,就是漏了某个依赖库,编译报错一脸懵。我当年也踩过不少坑,今天把这些经验都抖出来,你照着做就行。
2.1 交叉编译工具链安装
U-Boot 是跑在开发板上的,你的电脑是 x86 架构,开发板通常是 ARM 或 RISC-V。所以你需要一个「交叉编译器」——在 x86 上编译出 ARM 能跑的代码。
2.1.1 选择工具链
我个人习惯用 Linaro 提供的 gcc-arm-none-eabi 或 gcc-arm-linux-gnueabihf。具体选哪个,看你的目标平台:
| 目标平台 | 推荐工具链 | 说明 |
|---|---|---|
| ARM Cortex-A 系列(如 i.MX6、RK3288) | arm-linux-gnueabihf- | 支持硬浮点,性能更好 |
| ARM Cortex-M 系列(如 STM32MP1) | arm-none-eabi- | 裸机工具链,无操作系统依赖 |
| RISC-V 系列 | riscv64-unknown-linux-gnu- | RISC-V 64位,带 Linux 支持 |
2.1.2 安装步骤
以 Ubuntu 20.04/22.04 为例,我推荐两种方式:
方式一:apt 安装(简单,但版本可能较旧)
sudo apt update
sudo apt install gcc-arm-linux-gnueabihf
# 验证安装
arm-linux-gnueabihf-gcc --version
方式二:手动下载 Linaro 工具链(推荐,版本可控)
# 下载最新稳定版
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
# 解压到 /opt 目录
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/
# 添加环境变量(后面会详细讲)
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
2.2 依赖库安装
U-Boot 编译过程中会用到一些系统库。少了任何一个,编译都会中途报错。我把常用的依赖列出来:
sudo apt install -y \
build-essential \
libncurses5-dev \
libssl-dev \
bison \
flex \
swig \
python3-dev \
python3-pip \
device-tree-compiler
这里解释几个关键库的作用:
- libncurses5-dev:用于
make menuconfig图形化配置界面。没有它,你只能用文本方式改配置,效率很低。 - libssl-dev:U-Boot 支持安全启动和 FIT 镜像时,需要 OpenSSL 库。我遇到过有人编译 FIT 镜像时卡住,就是因为没装这个。
- device-tree-compiler (dtc):编译设备树(.dts -> .dtb)的工具。U-Boot 现在几乎离不开设备树,这个必须装。
- swig:用于生成 Python 绑定。如果你要用 U-Boot 的测试框架,这个少不了。
避坑指南:我曾经在 Ubuntu 18.04 上编译 U-Boot 2022.10,发现缺少 python3-distutils 导致编译中断。如果你也遇到类似问题,可以试试:
sudo apt install python3-distutils
2.3 环境变量配置
环境变量配置是很多人容易忽略的一步。说白了,就是告诉系统「我的工具链放在哪」。配置不对,编译时系统找不到编译器,直接报错。
2.3.1 临时配置(仅当前终端有效)
适合快速测试:
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
2.3.2 永久配置(推荐)
编辑 ~/.bashrc 或 ~/.profile,在末尾添加:
# U-Boot 编译环境配置
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
然后执行 source ~/.bashrc 使其生效。
env_setup.sh 脚本,里面写好环境变量。每次打开新终端,直接 source env_setup.sh 就行。这样不同项目可以用不同的工具链版本,互不干扰。
2.3.3 验证配置
配置完成后,运行以下命令验证:
echo $CROSS_COMPILE
# 输出应为:arm-linux-gnueabihf-
echo $ARCH
# 输出应为:arm
arm-linux-gnueabihf-gcc --version
# 应显示工具链版本信息
如果输出正确,恭喜你,环境搭建成功了!
2.4 知识体系总览
下面这张图帮你理清整个编译环境的搭建逻辑:
2.5 常见问题与解决
环境搭建过程中,你可能会遇到这些问题:
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
arm-linux-gnueabihf-gcc: command not found |
工具链未安装或 PATH 未配置 | 检查 PATH 是否包含工具链 bin 目录 |
fatal error: curses.h: No such file or directory |
缺少 libncurses-dev | sudo apt install libncurses5-dev |
undefined reference to `__aeabi_*' |
工具链与 U-Boot 版本不匹配 | 换用官方推荐的 gcc 版本 |
/bin/sh: 1: python: not found |
缺少 Python 或链接错误 | sudo apt install python3 && sudo ln -s /usr/bin/python3 /usr/bin/python |
嗯,环境搭建这部分就讲到这里。你按照上面的步骤操作,应该半小时内就能搞定。如果遇到问题,先检查环境变量,再检查依赖库——80% 的问题都出在这两个地方。