2. 开发环境搭建:Ubuntu 20.04/22.04安装、必要工具链安装、交叉编译工具链配置

做嵌入式Linux开发,环境搭建是第一道坎。很多人觉得装个系统、装几个软件包有什么难的?但我在带新人时发现,恰恰是这一步没走稳,后面编译内核、调试驱动时会冒出各种莫名其妙的问题。说白了,环境搭得对不对,直接决定了你后面是「一路绿灯」还是「步步踩坑」。

这一章,我就带你把RK3568的开发环境从头搭一遍。我自己的主力机是Ubuntu 22.04,但20.04也完全没问题,我会把两者的差异点都指出来。

2.1 操作系统选择与安装

先说说为什么选Ubuntu。RK3568的官方SDK、Rockchip提供的交叉编译工具链、以及Linux内核社区的主流工具,都是在Ubuntu上验证最充分的。你用CentOS或者Arch也不是不行,但遇到问题网上搜到的解决方案八成都是Ubuntu的,你想想看,何必跟自己过不去?

项目 Ubuntu 20.04 LTS Ubuntu 22.04 LTS
内核版本 5.4 5.15
GCC默认版本 9.3.0 11.2.0
Python默认版本 3.8 3.10
长期支持 至2025年 至2027年
与RK SDK兼容性 已验证,稳定 已验证,稳定

我个人习惯用22.04,因为工具链版本更新,编译速度会快一些。但如果你手头只有20.04的镜像,放心用,完全没问题。

我的建议: 如果你是新手,直接用Ubuntu 22.04桌面版。别折腾服务器版,桌面版自带的图形工具在排查网络、磁盘问题时能省不少事。

2.2 必要工具链安装

系统装好之后,第一件事就是装基础工具包。别一个一个手动装,我直接给你一个命令,一次性搞定。

sudo apt update
sudo apt upgrade -y
sudo apt install -y \
    build-essential \
    gcc \
    g++ \
    make \
    cmake \
    git \
    repo \
    python3 \
    python3-pip \
    python3-dev \
    flex \
    bison \
    libncurses-dev \
    libssl-dev \
    libelf-dev \
    device-tree-compiler \
    u-boot-tools \
    bc \
    cpio \
    rsync \
    unzip \
    wget \
    curl \
    vim \
    ssh \
    net-tools

这里面有几个我要重点说一下:

  • build-essential:包含了gcc、g++、make等编译核心工具,是C/C++开发的基石。
  • repo:Google开发的Git仓库管理工具,RK3568的SDK就是靠它来拉取多个Git仓库的。我第一次用repo时也觉得多此一举,后来发现几十个仓库手动管理根本不可能。
  • device-tree-compiler (dtc):设备树编译器,驱动开发中你会频繁用到它。把.dts编译成.dtb,或者反编译回来调试。
  • libncurses-dev、libssl-dev、libelf-dev:编译内核时必须的依赖库。缺了它们,make menuconfig会报错,内核模块签名也会失败。
我曾经踩过的坑: 有一次我装完系统后直接编译内核,结果报错说找不到openssl/ssl.h。查了半天才发现是libssl-dev没装。从那以后,我每次搭环境都会先跑一遍上面的安装命令,一个包都不漏。

2.3 交叉编译工具链配置

RK3568是ARM64架构的芯片,而你的PC是x86架构的。在x86上编译出ARM能运行的代码,就需要交叉编译工具链。说白了,就是一套在x86上运行、但生成ARM指令的编译器。

Rockchip官方提供了两种方式获取交叉编译工具链:

方式一:使用SDK自带的工具链

如果你已经下载了RK3568的完整SDK,里面已经包含了预编译好的交叉编译工具链。路径一般在:

prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/

方式二:手动下载安装

我个人更推荐这种方式,因为你可以把工具链独立出来,多个项目共用。从ARM官网或Linaro官网下载:

# 下载ARM64交叉编译工具链
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz

# 解压到指定目录
sudo tar -xvf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/

# 配置环境变量
echo 'export PATH=$PATH:/opt/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

配置完成后,验证一下是否生效:

aarch64-none-linux-gnu-gcc --version

如果能看到版本信息,说明工具链已经就绪。

关键环境变量说明:
  • CROSS_COMPILE:指定交叉编译器的前缀。内核编译时,Makefile会自动加上这个前缀去找对应的编译器。
  • ARCH:指定目标架构为arm64。这个变量告诉内核编译系统,我们要生成的是ARM64的代码。

2.4 开发环境核心结构图

下面这张图展示了整个开发环境的层次关系,从宿主机到目标板,每一层都有对应的工具和配置。我建议你把它存下来,后面每次遇到环境问题,都可以回来对照着排查。

RK3568 开发环境核心结构 宿主机 (x86_64 Ubuntu 20.04/22.04) 基础工具链 (gcc, make, git) 交叉编译工具链 (aarch64) SDK管理工具 (repo) 编译产物 内核镜像 (Image) 设备树 (dtb) 内核模块 (.ko) 目标板 (RK3568 ARM64) Bootloader (U-Boot) Linux内核 根文件系统 (rootfs) 调试与验证 串口/SSH登录 dmesg / 内核日志

2.5 验证环境是否就绪

环境搭完了,别急着往下走。先跑几个命令确认一下所有工具都正常工作。我每次搭完环境都会执行一遍这个检查清单:

# 1. 检查基础工具
gcc --version
make --version
git --version
repo --version

# 2. 检查交叉编译工具链
aarch64-none-linux-gnu-gcc --version
echo $CROSS_COMPILE
echo $ARCH

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

aarch64-none-linux-gnu-gcc -o hello hello.c
file hello
# 输出应该包含 "ELF 64-bit LSB executable, ARM aarch64"
一个小技巧: 用file命令查看编译出来的二进制文件,确认架构是ARM aarch64而不是x86-64。我见过有人交叉编译工具链没配好,结果编译出来的还是x86的可执行文件,放到板子上直接报"Exec format error"。

2.6 常见问题与避坑指南

  • repo init 失败:通常是网络问题。国内用户建议配置Git代理,或者使用清华、中科大的镜像源。
  • 交叉编译器找不到:检查PATH环境变量是否包含了工具链的bin目录。我习惯在~/.bashrc里写死路径,避免每次打开新终端都要重新source。
  • 编译内核时报错"missing linker script":一般是ARCH环境变量没设置,或者设置成了x86。执行export ARCH=arm64即可。
  • make menuconfig 报错:缺少libncurses-dev,装一下就好。
我曾经踩过的坑: 有一次我换了台新电脑,装完Ubuntu 22.04后直接编译内核,结果报错说elf.h找不到。查了半天才发现是libelf-dev没装。这个包在20.04上是默认安装的,但22.04的桌面版居然没有预装。从那以后,我每次搭环境都会严格按照上面的命令列表来,一个都不跳过。

环境搭好了,工具链也配好了。接下来就可以正式开始内核编译和驱动开发了。记住,环境搭建这一步花的时间,后面都会加倍省回来。