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 知识体系总览

下面这张图,把本章的知识结构串起来了:

开发环境搭建知识体系 RK3568 开发环境 Ubuntu 22.04 LTS 必要工具链安装 交叉编译工具链 系统安装与分区 软件源配置 build-essential libncurses5-dev / libssl-dev device-tree-compiler gcc-arm-10.3 下载 PATH / CROSS_COMPILE 配置 验证:file test → ARM aarch64 核心要点 ① 系统选 ext4 文件系统,避免 Btrfs 坑 ② 工具链版本与 BSP 内核对齐,不要追新 ③ CROSS_COMPILE 变量末尾必须带短横线 -

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 环境验证清单

配完环境后,我建议你按这个清单逐项检查,确保万无一失:

  1. 系统检查:lsb_release -a 确认是 Ubuntu 22.04
  2. 磁盘检查:df -h 确认剩余空间 > 50GB
  3. 基础工具检查:gcc --version && make --version
  4. 交叉工具链检查:aarch64-none-linux-gnu-gcc --version
  5. 环境变量检查:echo $CROSS_COMPILE 输出 aarch64-none-linux-gnu-
  6. 编译测试:写一个 hello.c,用交叉编译器编译,file hello 确认是 ARM aarch64