2、开发环境准备:安装Ubuntu主机、配置交叉编译工具链、安装必要软件包

RK3568 作为一款高性能、低功耗的嵌入式应用处理器,其 rootfs(根文件系统)的构建与系统部署工作,本质上是一个在主机端进行“交叉开发”的过程。这意味着我们所有的编译、打包和调试工作都在性能强大的 x86 架构 Ubuntu 主机上完成,而最终生成的二进制镜像则运行在 ARM 架构的 RK3568 目标板上。因此,一个干净、完整且版本匹配的开发环境,是整个课程实验能否顺利推进的基石。本章将系统性地讲解如何从零开始搭建这套环境,涵盖 Ubuntu 主机的安装与初始化、交叉编译工具链的配置,以及关键软件包的安装与验证。

RK3568 交叉开发环境逻辑链路图 x86 Ubuntu 主机 • Ubuntu 20.04 / 22.04 LTS • 交叉编译工具链 (aarch64) • build-essential / git / repo • 磁盘 ≥ 200GB,内存 ≥ 16GB SSH / USB RK3568 目标板 • ARMv8-A 架构 (64-bit) • 运行编译生成的 rootfs • 内核 + DTB + 根文件系统 • 串口 / 网口调试 工具链核心组件 • aarch64-linux-gnu-gcc • aarch64-linux-gnu-g++ • aarch64-linux-gnu-ld / objcopy • sysroot (libc, libm, pthread) 编译产物 环境搭建四步走 ① 安装 Ubuntu 虚拟机 / 物理机 ② 基础软件包 build-essential 等 ③ 交叉工具链 aarch64-linux-gnu-* ④ 验证环境 编译 Hello World 图:RK3568 开发环境由主机、工具链、目标板三要素构成,搭建顺序遵循“系统→依赖→工具→验证”

上图清晰地展示了整个开发环境的逻辑结构:左侧是开发者日常操作的 x86 Ubuntu 主机,中间是通过交叉编译工具链生成的 ARM 二进制产物,右侧是最终运行这些产物的 RK3568 目标板。本章的核心任务,就是打通从“主机”到“目标板”之间的这条编译与部署通道。下面我们将按照“安装系统 → 安装依赖 → 配置工具链 → 验证环境”的顺序,逐步完成实战环境的搭建。

2.1 核心原理:为什么需要交叉编译环境

嵌入式开发与普通 PC 软件开发最大的区别在于“架构鸿沟”。RK3568 采用的是 ARMv8-A 架构(AArch64),而我们的开发主机通常是 x86_64 架构。x86 的指令集与 ARM 的指令集完全不同,因此在 x86 主机上直接编译出的程序无法在 RK3568 上运行。交叉编译(Cross Compilation)正是为了解决这一问题而生:在性能强大的 x86 主机上,运行一个专门生成 ARM 机器码的编译器(即交叉编译器),它编译出的可执行文件、静态库和动态库,可以直接拷贝到 RK3568 的 rootfs 中执行。

交叉编译环境的核心组件包括:交叉编译器(如 aarch64-linux-gnu-gcc)、目标系统库(sysroot,包含 ARM 版本的 libc、libm、pthread 等)、以及配套工具(如 aarch64-linux-gnu-objdump 用于反汇编,aarch64-linux-gnu-strip 用于裁剪体积)。理解这一原理,有助于我们后续在构建 rootfs 时,正确区分“主机工具”与“目标板组件”,避免将 x86 的库误打包进 ARM 镜像。

2.2 判断方法与操作流程:Ubuntu 主机安装与初始化

虽然 RK3568 的 SDK(软件开发套件)理论上支持较新的 Ubuntu 24.04,但考虑到瑞芯微官方提供的 buildroot 和 Debian 构建脚本在 LTS(长期支持)版本上测试最为充分,强烈推荐使用 Ubuntu 20.04 LTS 或 22.04 LTS。如果你使用的是 Windows 或 macOS,建议通过 VMware Workstation 或 VirtualBox 安装虚拟机;如果是独立开发机,直接物理安装即可。

安装完成后,请立即执行以下初始化操作,确保系统处于最新状态并具备基础编译能力:

# 1. 更新软件源并升级系统(首次执行耗时较长,约10-20分钟)
sudo apt update
sudo apt full-upgrade -y

# 2. 安装基础编译工具链(build-essential 包含 gcc, g++, make 等)
sudo apt install -y build-essential

# 3. 安装版本控制与代码管理工具
sudo apt install -y git git-lfs repo

# 4. 安装后续构建 rootfs 可能用到的辅助工具
sudo apt install -y python3 python3-pip device-tree-compiler u-boot-tools
sudo apt install -y ssh rsync file tree lzop libncurses5-dev libssl-dev

在安装过程中,请留意终端输出。如果出现 Unable to locate package 错误,通常是因为软件源未更新或网络问题。此时可执行 sudo apt update 后再试。安装完成后,可以通过 gcc --version 和 git --version 验证是否成功。

经验提醒: 对于虚拟机用户,建议将磁盘容量设置为至少 200GB(RK3568 的 SDK 完整下载并编译后,占用空间可能超过 100GB),内存分配不低于 16GB,CPU 核心数不低于 4 核。如果磁盘空间不足,后续编译过程中极易出现 No space left on device 错误,导致构建中断。

2.3 案例拆解:配置 RK3568 交叉编译工具链

交叉编译工具链的获取有两种主流方式:方式一是使用 Ubuntu 官方源提供的 gcc-aarch64-linux-gnu 包;方式二是使用瑞芯微 SDK 内置的预编译工具链。对于本课程而言,我们推荐使用方式一,因为它更通用、更稳定,且与系统库的兼容性更好。

以下是具体的配置步骤:

# 1. 安装 ARM64 交叉编译工具链
sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 2. 验证安装是否成功(注意输出中应包含 aarch64-linux-gnu 字样)
aarch64-linux-gnu-gcc --version

# 3. 编写一个简单的测试程序,验证交叉编译是否可用
cat << EOF > hello.c
#include <stdio.h>
int main() {
    printf("Hello from RK3568!\n");
    return 0;
}
EOF

# 4. 使用交叉编译器编译(注意:不能直接使用 gcc,必须使用 aarch64-linux-gnu-gcc)
aarch64-linux-gnu-gcc hello.c -o hello_arm

# 5. 查看生成文件的架构类型(应显示 ARM aarch64)
file hello_arm

执行 file hello_arm 后,如果输出包含 ELF 64-bit LSB executable, ARM aarch64,则说明交叉编译工具链配置成功。此时生成的 hello_arm 文件无法在 x86 主机上直接运行,但可以拷贝到 RK3568 的 rootfs 中执行。

工具名称 作用说明 验证命令
aarch64-linux-gnu-gcc ARM64 C 语言交叉编译器 aarch64-linux-gnu-gcc --version
aarch64-linux-gnu-g++ ARM64 C++ 语言交叉编译器 aarch64-linux-gnu-g++ --version
aarch64-linux-gnu-ld ARM64 链接器,用于链接目标文件 aarch64-linux-gnu-ld --version
aarch64-linux-gnu-objdump 查看 ARM 二进制文件的段信息和反汇编 aarch64-linux-gnu-objdump -d hello_arm
aarch64-linux-gnu-strip 去除符号表,减小二进制体积 aarch64-linux-gnu-strip hello_arm

2.4 实战场景:repo 工具初始化与 SDK 获取

在构建 rootfs 之前,我们需要先获取 RK3568 的 SDK 源码。瑞芯微官方推荐使用 repo 工具来管理多个 Git 仓库。repo 本身是一个 Python 脚本,用于简化对多个 Git 仓库的版本管理。虽然我们已经在 2.2 节安装了 repo,但还需要对其进行初始化配置。

# 1. 创建 SDK 存放目录(建议放在家目录下,避免权限问题)
mkdir -p ~/rk3568_sdk
cd ~/rk3568_sdk

# 2. 初始化 repo 仓库(此处使用瑞芯微公开的 manifest 仓库地址,实际项目请替换为内部地址)
repo init -u https://github.com/rockchip-linux/manifests.git -b master -m rk3568_linux_release.xml

# 3. 同步全部源码(耗时较长,取决于网络速度,通常需要 30-60 分钟)
repo sync -j8 -c

在执行 repo sync 时,如果网络不稳定,可能会中断。此时可以重新执行 repo sync,repo 会断点续传。同步完成后,SDK 目录下会包含 kernel/、u-boot/、buildroot/、debian/ 等核心子目录,这些目录将在后续章节中频繁使用。

风险提示: 切勿在 root 用户下直接执行 repo sync,否则后续编译过程中会产生大量 root 拥有的文件,导致普通用户无法修改或删除。建议始终使用普通用户操作,并在需要权限时使用 sudo。

2.5 常见误区与总结复盘

在搭建开发环境的过程中,初学者最容易犯以下几个错误,需要特别留意:

  • 误区一:使用 x86 的 gcc 直接编译。 这会导致生成的二进制文件无法在 RK3568 上运行,报错 Exec format error。务必检查编译时使用的编译器前缀是否为 aarch64-linux-gnu-。
  • 误区二:忽略 sysroot 的存在。 交叉编译时,链接器默认会去工具链自带的 sysroot 目录下寻找 libc 等库文件。如果手动指定了 -I 或 -L 指向 x86 的头文件或库路径,轻则编译告警,重则链接失败或运行时崩溃。
  • 误区三:磁盘空间规划不足。 很多同学在虚拟机中只分配了 60GB 磁盘,结果编译到一半就空间耗尽。建议在安装系统时直接分配 200GB 以上,或者使用 LVM 逻辑卷管理以便后续扩容。
  • 误区四:repo 同步时使用单线程。 默认的 repo sync 是串行下载,速度极慢。务必加上 -j8 参数(8 表示并发数,可根据 CPU 核心数调整)以加速下载。