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 ⭐⭐⭐ 需要额外配置源,新手不推荐
其他发行版 ⭐⭐ 依赖包名不同,容易踩坑
我的建议:如果你手头是 Windows 或 macOS,直接用 VMware/VirtualBox 装 Ubuntu 22.04 虚拟机。分配 4 核 CPU + 8GB 内存 + 100GB 磁盘,编译内核和 U-Boot 完全够用。

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 版本问题。

注意:不要用 sudo pip3 install 安装 Python 包,容易破坏系统 Python 环境。建议用 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 开发板上才能跑。

小技巧:如果你需要同时编译 32 位 ARM 程序(比如某些裸机固件),可以再装一个 arm-linux-gnueabihf 工具链。下载方式一样,把 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 kernel
git submodule update --depth 1 u-boot
git 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 知识结构总览

下面这张图概括了本章的核心流程,你可以把它当作环境搭建的「检查清单」:

开发环境搭建流程 开发环境搭建核心流程 Ubuntu 22.04 LTS 安装基础依赖包 gcc-arm-10.3 工具链 SDK 源码获取 子模块同步与验证 关键检查点 ✅ dtc 版本 ≥ 1.5.0 ✅ gcc --version 输出 ✅ file hello 验证 ✅ kernel/ 目录存在 ✅ u-boot/ 目录存在 ✅ buildroot/ 目录存在 ✅ device/rockchip/ 存在 ⚠ 子模块用 --depth 1 ⚠ 不要 sudo pip3 install 💡 网络中断可逐个 同步子模块

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/ 目录备份一下,下次换电脑或重装系统时直接解压就能用,省去重复下载的麻烦。