2. 开发环境搭建:Ubuntu 22.04安装、必要工具链安装、交叉编译工具链配置
做嵌入式开发,环境搭建是第一步,也是最容易踩坑的一步。我记得刚入行那会儿,光配环境就折腾了两天,后来发现是源选错了。这一章,我带你把 RK3568 的开发环境一次配好,不走弯路。
本章核心目标:在 x86 主机上搭建一套完整的 RK3568 内核编译环境,包括 Ubuntu 22.04 系统、基础工具链、以及 RK3568 专用的交叉编译工具链。
2.1 为什么选择 Ubuntu 22.04?
说白了,选系统就是选生态。RK3568 的官方 SDK 和 BSP 包,大部分都在 Ubuntu 18.04/20.04/22.04 上验证过。我个人习惯用 22.04 LTS,原因有三:
- 软件源新:gcc-11、Python 3.10 这些直接 apt 就能装,不用自己编译
- 长期支持:到 2027 年才停止维护,项目周期内不用折腾系统升级
- 社区活跃:遇到问题,Stack Overflow 上一搜一大把答案
你可能会问:「我用 Ubuntu 20.04 行不行?」行,但有些包需要手动升级,麻烦。我建议直接上 22.04,省心。
2.2 安装 Ubuntu 22.04
安装过程我就不逐字写了,网上教程一堆。这里只提几个关键点:
| 项目 | 推荐配置 | 说明 |
|---|---|---|
| CPU | 4 核及以上 | 编译内核时,多核能省一半时间 |
| 内存 | 16 GB 及以上 | 8GB 也能跑,但 swap 会频繁读写,慢 |
| 硬盘 | 256 GB SSD | SDK 解压后约 30GB,编译产物另占 20GB |
| 文件系统 | ext4 | 不要用 NTFS 或 exFAT,符号链接会出问题 |
我曾经踩过的坑:第一次装系统时用了 Btrfs 文件系统,结果编译时频繁报「磁盘空间不足」,查了半天才发现是 Btrfs 的元数据占用了大量空间。后来老老实实换回 ext4,再没出过问题。
2.3 必要工具链安装
系统装好后,第一件事就是装基础工具。这些包是编译内核的「前置条件」,缺一个都可能报莫名其妙的错。
# 更新软件源
sudo apt update
sudo apt upgrade -y
# 安装基础编译工具
sudo apt install -y \
build-essential \
gcc \
g++ \
make \
cmake \
autoconf \
automake \
libtool \
pkg-config \
bison \
flex \
texinfo \
help2man \
gawk \
libncurses5-dev \
libssl-dev \
libelf-dev \
libudev-dev \
libpci-dev \
libiberty-dev \
libgmp-dev \
libmpfr-dev \
libmpc-dev \
zlib1g-dev \
device-tree-compiler \
u-boot-tools \
bc \
cpio \
rsync \
git \
wget \
curl \
python3 \
python3-pip \
python3-dev \
python3-venv
这里我特别想强调几个包:
- libncurses5-dev:没有它,
make menuconfig会报错,你连内核配置界面都进不去 - libssl-dev:编译内核模块签名时需要,缺了会报
Cannot use CONFIG_CC_STACKPROTECTOR_STRONG - device-tree-compiler:编译设备树(.dts → .dtb)的必备工具
- u-boot-tools:生成 uImage 格式时需要
mkimage命令
小技巧:装完这些包后,可以用 dpkg -l | grep -E "libncurses|libssl|libelf" 检查一下是否都装上了。我习惯把这个命令写在笔记里,每次换机器都跑一遍。
2.4 交叉编译工具链配置
RK3568 是 ARM64 架构,而你的开发机是 x86 架构。在 x86 上编译 ARM 代码,就需要交叉编译工具链。
2.4.1 工具链选择
RK3568 官方推荐使用 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu 这个版本。为什么是 10.3?因为 RK 的 BSP 内核(Linux 5.10)就是用这个版本验证的。换其他版本不是不行,但可能遇到一些奇奇怪怪的兼容性问题。
我手头有张对比表,你可以看看:
| 工具链版本 | GCC 版本 | 兼容性 | 推荐度 |
|---|---|---|---|
| gcc-arm-10.3-2021.07 | 10.3 | 官方验证,完美兼容 | ⭐⭐⭐⭐⭐ |
| gcc-arm-11.2-2022.02 | 11.2 | 大部分功能正常,偶有警告 | ⭐⭐⭐⭐ |
| Linaro 7.5 | 7.5 | 太老,不支持 C11 特性 | ⭐⭐ |
| 系统自带 gcc-aarch64 | 随系统版本 | 可能缺少 ARM 专用优化选项 | ⭐⭐⭐ |
2.4.2 下载与安装
下载地址在 ARM 官网的「GNU Toolchain」页面。我习惯用 wget 直接拉:
# 创建工具链目录
mkdir -p ~/rk3568/toolchain
cd ~/rk3568/toolchain
# 下载(约 200MB,看网速)
wget https://developer.arm.com/-/media/Files/downloads/gnu/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
# 解压
tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
# 解压后目录结构
ls -l gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/
# 输出:
# bin/ lib/ libexec/ share/ aarch64-none-linux-gnu/
2.4.3 配置环境变量
解压完只是第一步,关键是要让系统能找到这些工具。配置环境变量有两种方式:
方式一:临时生效(推荐测试用)
export PATH=$PATH:~/rk3568/toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin
export CROSS_COMPILE=aarch64-none-linux-gnu-
export ARCH=arm64
方式二:永久生效(推荐日常用)
# 编辑 ~/.bashrc
echo 'export PATH=$PATH:~/rk3568/toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin' >> ~/.bashrc
echo 'export CROSS_COMPILE=aarch64-none-linux-gnu-' >> ~/.bashrc
echo 'export ARCH=arm64' >> ~/.bashrc
# 使配置生效
source ~/.bashrc
注意:CROSS_COMPILE 变量后面一定要带短横线 -。我见过有人写成 aarch64-none-linux-gnu(没加横线),结果编译时系统找不到 aarch64-none-linux-gnu-gcc,报了一堆 command not found。
2.4.4 验证工具链
配置完一定要验证,别等到编译时才发现有问题。
# 检查 gcc 版本
aarch64-none-linux-gnu-gcc --version
# 输出示例:
# aarch64-none-linux-gnu-gcc (GNU Toolchain for the A-profile Architecture 10.3-2021.07) 10.3.1 20210621
# 检查环境变量
echo $CROSS_COMPILE
# 输出:aarch64-none-linux-gnu-
echo $ARCH
# 输出:arm64
# 编译一个简单的测试程序
echo 'int main(){return 0;}' > test.c
aarch64-none-linux-gnu-gcc -o test test.c
# 查看生成的文件类型
file test
# 输出:test: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1
看到 ARM aarch64 这几个字,说明交叉编译工具链已经配好了。
2.5 知识体系总览
下面这张图,把本章的知识结构串起来了:
2.6 常见问题与避坑
环境搭建这块,我踩过的坑比走过的路还多。挑几个典型的说说:
问题1:编译时提示「/bin/sh: 1: aarch64-none-linux-gnu-gcc: not found」
原因:PATH 没配置对,或者工具链没解压完整。
解决:先跑 echo $PATH 看看有没有包含工具链的 bin 目录。如果没有,重新 source 一下 .bashrc。
问题2:make menuconfig 报错「Unable to find the ncurses libraries」
原因:libncurses5-dev 没装,或者装了 libncurses-dev(版本不对)。
解决:sudo apt install libncurses5-dev,注意是 5 不是 6。
问题3:编译内核时报「No rule to make target 'debian/certs/signing_key.pem'」
原因:内核开启了模块签名,但没有生成签名密钥。
解决:在 make menuconfig 里关掉 CONFIG_MODULE_SIG,或者先生成密钥:make -C certs。
2.7 环境验证清单
配完环境后,我建议你按这个清单逐项检查,确保万无一失:
- 系统检查:
lsb_release -a确认是 Ubuntu 22.04 - 磁盘检查:
df -h确认剩余空间 > 50GB - 基础工具检查:
gcc --version && make --version - 交叉工具链检查:
aarch64-none-linux-gnu-gcc --version - 环境变量检查:
echo $CROSS_COMPILE输出aarch64-none-linux-gnu- - 编译测试:写一个 hello.c,用交叉编译器编译,
file hello确认是 ARM aarch64