第一章 U-Boot编译环境搭建:交叉编译工具链安装、环境变量设置、源码获取与版本选择
说实话,做嵌入式开发这么多年,我见过太多人在环境搭建这一步就卡住了。明明代码逻辑没问题,编译却报一堆莫名其妙的错误。说白了,大部分问题都出在交叉编译工具链上。今天咱们就把这块彻底捋清楚。
1.1 为什么需要交叉编译?
你想想看,你的电脑是x86架构的,而U-Boot要跑在ARM或RISC-V芯片上。x86的指令,ARM芯片根本看不懂。所以我们需要一个「翻译官」——在x86电脑上运行,却能生成ARM机器码的工具。这就是交叉编译工具链。
我刚开始做嵌入式那会儿,总想着直接在开发板上编译U-Boot。结果呢?一块树莓派编译个U-Boot要半小时,电脑上只要两分钟。嗯,从那以后我再也没在板子上编译过。
核心概念:交叉编译 = 在A架构上生成B架构的可执行文件
1.2 交叉编译工具链的选择
工具链的选择其实有讲究。我个人习惯用Linaro提供的预编译工具链,稳定且社区支持好。当然,你也可以自己用crosstool-NG从头构建,但说实话,除非你有特殊需求,否则没必要折腾。
常见的工具链有这些:
| 目标架构 | 工具链前缀 | 推荐版本 |
|---|---|---|
| ARM (32位) | arm-linux-gnueabihf- | gcc 9.3+ |
| ARM64 (AArch64) | aarch64-linux-gnu- | gcc 10.2+ |
| RISC-V (64位) | riscv64-linux-gnu- | gcc 11.1+ |
我在项目中遇到过一个问题:用太新的gcc编译老版本U-Boot,结果链接阶段报了一堆undefined reference。后来发现是工具链的ABI不兼容。所以我的建议是:U-Boot版本和工具链版本要匹配。
1.3 安装交叉编译工具链
以Ubuntu 20.04为例,安装ARM64工具链很简单:
sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install libncurses-dev # 用于menuconfig配置界面
安装完成后,验证一下:
aarch64-linux-gnu-gcc --version
# 输出类似:aarch64-linux-gnu-gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
小技巧:如果你用的是Windows,建议装WSL2或者直接用Docker。我曾经在Windows上折腾Cygwin搞了三天,最后还是换回了Linux虚拟机。省心。
1.4 环境变量设置
工具链装好了,但系统还不知道它在哪。我们需要设置环境变量。我个人习惯把配置写在 ~/.bashrc 里:
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
export PATH=$PATH:/usr/bin # 工具链默认就在/usr/bin下
然后执行 source ~/.bashrc 使其生效。
这里有个坑:CROSS_COMPILE 变量后面一定要带短横线!我见过有人写成 aarch64-linux-gnu 没加横线,结果编译时U-Boot找不到工具链,报错说 aarch64-linux-gnugcc: command not found。嗯,这种低级错误我也犯过。
注意:每次打开新终端,都要确保环境变量已加载。建议在项目目录下放一个 setenv.sh 脚本,每次编译前执行 source setenv.sh。
1.5 源码获取与版本选择
U-Boot源码托管在 https://source.denx.de/u-boot/u-boot。获取方式有两种:
- 下载稳定版压缩包:
wget https://source.denx.de/u-boot/u-boot/-/archive/v2023.10/u-boot-v2023.10.tar.bz2 - 克隆Git仓库:
git clone https://source.denx.de/u-boot/u-boot.git
版本怎么选?我的经验是:
- 新项目用最新稳定版(比如v2023.10)
- 维护老项目用对应板子厂商提供的BSP版本
- 别用开发版(-rc后缀),除非你想帮社区测bug
为什么?有一次我图新鲜用了v2022.01-rc3,结果发现某个网卡驱动有bug,调试了两天才定位到问题。后来换回v2021.10稳定版,一切正常。所以,稳定压倒一切。
1.6 验证环境是否搭建成功
环境搭好了,我们来验证一下。以QEMU模拟的ARM64平台为例:
cd u-boot
make qemu_arm64_defconfig
make -j4
如果一切顺利,你会看到:
LD u-boot
OBJCOPY u-boot.srec
OBJCOPY u-boot.bin
...
看到 u-boot.bin 生成,说明环境搭建成功了。
避坑指南:如果编译报错 *** Your GCC is older than 6.0,说明工具链版本太老。我曾经在Ubuntu 18.04上遇到过,升级到gcc-7就解决了。
1.7 本章知识体系
下面这张图总结了整个环境搭建的流程:
说白了,环境搭建就是这三步:选工具链、装工具链、设环境变量。剩下的就是拉代码、编译验证。别想得太复杂。
可可精品资料库