2、开发环境准备:安装Ubuntu主机、配置交叉编译工具链、安装必要软件包
RK3568 作为一款高性能、低功耗的嵌入式应用处理器,其 rootfs(根文件系统)的构建与系统部署工作,本质上是一个在主机端进行“交叉开发”的过程。这意味着我们所有的编译、打包和调试工作都在性能强大的 x86 架构 Ubuntu 主机上完成,而最终生成的二进制镜像则运行在 ARM 架构的 RK3568 目标板上。因此,一个干净、完整且版本匹配的开发环境,是整个课程实验能否顺利推进的基石。本章将系统性地讲解如何从零开始搭建这套环境,涵盖 Ubuntu 主机的安装与初始化、交叉编译工具链的配置,以及关键软件包的安装与验证。
上图清晰地展示了整个开发环境的逻辑结构:左侧是开发者日常操作的 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 验证是否成功。
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/ 等核心子目录,这些目录将在后续章节中频繁使用。
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 核心数调整)以加速下载。