2. 开发环境搭建:Ubuntu 22.04 环境配置、交叉编译工具链安装与 SDK 获取
做嵌入式 Linux 开发,环境搭建是第一道坎。很多新手在这一步就被劝退了——工具链版本不对、SDK 同步失败、依赖库缺失,折腾一整天连个 hello world 都跑不起来。我刚开始搞 Rockchip 平台时也踩过不少坑,这次就把我这些年积累的「标准操作流程」分享给你。
2.1 为什么选择 Ubuntu 22.04?
说白了,选哪个发行版不重要,重要的是生态兼容性。Rockchip 官方 SDK 和 Buildroot/Yocto 构建系统,在 Ubuntu 22.04 LTS 上测试最充分。我个人习惯用 LTS 版本,省心。
| 发行版 | 推荐度 | 理由 |
|---|---|---|
| Ubuntu 22.04 LTS | ⭐⭐⭐⭐⭐ | 官方 SDK 首选,依赖库全,社区支持好 |
| Ubuntu 20.04 LTS | ⭐⭐⭐⭐ | 兼容性尚可,但部分新工具链需要手动升级 |
| Debian 11/12 | ⭐⭐⭐ | 需要额外配置源,新手不推荐 |
| 其他发行版 | ⭐⭐ | 依赖包名不同,容易踩坑 |
2.2 基础环境配置
装完系统第一件事,更新软件源并安装必备依赖。别偷懒,这一步漏了后面会各种报错。
# 更新软件源
sudo apt update && sudo apt upgrade -y
# 安装基础开发工具
sudo apt install -y \
git \
wget \
curl \
vim \
build-essential \
cmake \
python3 \
python3-pip \
device-tree-compiler \
u-boot-tools \
bison \
flex \
libssl-dev \
libncurses-dev \
libelf-dev \
bc \
cpio \
rsync \
unzip \
file \
swig \
libpython3-dev \
pkg-config
这里有个坑——device-tree-compiler(dtc)版本不能太老。Ubuntu 22.04 自带的 dtc 1.6.1 够用,但如果你用 20.04,dtc 版本可能低于 1.5.0,编译某些新设备树会报语法错误。我遇到过一回,折腾半天才发现是 dtc 版本问题。
python3 -m venv 创建虚拟环境,或者用 --user 参数。
2.3 交叉编译工具链安装(gcc-arm-10.3)
交叉编译工具链,说白了就是在 x86 电脑上编译出 ARM 架构能跑的程序。Rockchip 官方推荐 gcc-arm-10.3-2021.07 版本,我试过 gcc-11 和 gcc-12,编译内核时会有一些警告,虽然能过但心里不踏实。
2.3.1 下载与解压
# 创建工作目录
mkdir -p ~/rk3588/toolchain
cd ~/rk3588/toolchain
# 下载 ARM64 交叉编译器(aarch64)
wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
# 解压
tar -xf gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
# 重命名(方便管理)
mv gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu gcc-arm-10.3
为什么我写 10.3 却下载 11.2?
ARM 官方从 2021.07 之后跳过了 10.3 的公开发布,直接给了 11.2。但 Rockchip SDK 内部文档仍沿用「gcc-arm-10.3」这个称呼。实际用 11.2 完全兼容,别被名字吓到。
2.3.2 配置环境变量
我个人习惯把工具链路径加到 ~/.bashrc 里,这样每次开终端自动生效。
echo 'export PATH=$PATH:~/rk3588/toolchain/gcc-arm-10.3/bin' >> ~/.bashrc
source ~/.bashrc
# 验证安装
aarch64-none-linux-gnu-gcc --version
如果输出类似 aarch64-none-linux-gnu-gcc (GCC) 11.2.1 20220111,说明安装成功。
2.3.3 测试交叉编译
写个简单的 C 程序验证一下:
# hello.c
#include <stdio.h>
int main() {
printf("Hello Rockchip!\n");
return 0;
}
# 交叉编译
aarch64-none-linux-gnu-gcc -o hello hello.c
# 查看生成的文件类型
file hello
# 输出: hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1
看到 ARM aarch64 就对了。这个程序不能在 x86 电脑上直接运行,得放到 RK3588 开发板上才能跑。
aarch64 换成 arm 即可。
2.4 SDK 源码获取与同步
Rockchip 的 SDK 托管在 GitHub 和 GitLab 上,但直接 git clone 整个仓库会非常慢——因为里面包含了 U-Boot、内核、Buildroot 等多个子模块,总大小超过 10GB。
2.4.1 获取 SDK 主仓库
cd ~/rk3588
# 方式一:浅克隆(推荐,速度快)
git clone --depth 1 https://github.com/rockchip-linux/rk3588-linux.git
# 方式二:完整克隆(需要完整历史记录时用)
git clone https://github.com/rockchip-linux/rk3588-linux.git
cd rk3588-linux
2.4.2 同步子模块
SDK 主仓库本身只是个「壳」,真正的代码在子模块里。同步子模块是最容易出问题的环节。
# 初始化子模块
git submodule init
# 同步子模块(这一步会下载内核、U-Boot、Buildroot 等)
git submodule update --recursive --depth 1
如果网络不好,子模块下载到一半断了怎么办?我建议用 --depth 1 参数,只拉取最新版本,不要历史记录,能省 80% 的下载量。
git submodule update --recursive 不带 --depth 1,结果下载到 70% 网络断了,重新来又得从头开始。后来我改成先同步单个子模块,逐个确认:git submodule update --depth 1 kernelgit submodule update --depth 1 u-bootgit submodule update --depth 1 buildroot
2.4.3 验证 SDK 完整性
同步完成后,检查关键目录是否存在:
ls -la kernel/
ls -la u-boot/
ls -la buildroot/
ls -la device/rockchip/
如果这些目录都有内容,说明 SDK 获取成功。其中 device/rockchip/ 目录下存放了各款芯片的设备树源文件(.dts),这是我们后面调试的重点。
2.5 知识结构总览
下面这张图概括了本章的核心流程,你可以把它当作环境搭建的「检查清单」:
2.6 常见问题与避坑指南
- 问题:git submodule update 报 SSL 错误
原因:公司网络代理或防火墙拦截。解决方法:git config --global http.sslVerify false,或者换成 SSH 协议克隆。 - 问题:编译内核时报
scripts/dtc/dtc: not found
原因:dtc 工具未安装或版本太旧。我遇到过一回,重装device-tree-compiler就好了。 - 问题:交叉编译器提示
cannot execute binary file: Exec format error
原因:下载了 ARM 版本的编译器,而不是 x86 版本。检查文件名,确保是x86_64开头。 - 问题:SDK 同步到一半磁盘空间不足
原因:完整克隆需要 15GB+ 空间。建议用--depth 1浅克隆,只需 5GB 左右。
我的经验总结:环境搭建这件事,一次配好,长期受益。我建议你把整个 ~/rk3588/ 目录备份一下,下次换电脑或重装系统时直接解压就能用,省去重复下载的麻烦。