2、开发环境搭建:Ubuntu 22.04环境配置,交叉编译工具链安装,Repo与Git管理SDK

做嵌入式Linux开发,环境搭建是第一道坎。很多人觉得装个系统、装个编译器有什么难的?但我在带新人时发现,十有八九的问题都出在环境上——要么是Python版本不对,要么是工具链路径没配好,要么是Repo同步到一半断了。

这一章,我就带你一步步把环境搭扎实。我们用的是Ubuntu 22.04 LTS,Rockchip官方SDK目前对这个版本支持最好。

2.1 Ubuntu 22.04 基础环境配置

我个人习惯装完系统第一件事就是换源。国内网络环境你懂的,不换源的话,apt install能等到你怀疑人生。

换源建议: 推荐使用清华源或中科大源。别用阿里源,我踩过坑——有些包版本同步不及时。
# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 替换为清华源(Ubuntu 22.04 Jammy)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list

sudo apt update && sudo apt upgrade -y

接下来安装必备软件包。Rockchip SDK编译依赖比较多,我整理了一份清单,直接复制执行就行。

sudo apt install -y \
    git repo curl wget \
    build-essential lzop libncurses5-dev \
    libssl-dev libelf-dev device-tree-compiler \
    python3 python3-pip python3-dev \
    bison flex gawk \
    cpio rsync unzip zip \
    pkg-config libc6-i386 lib32stdc++6 \
    libgmp-dev libmpc-dev libmpfr-dev \
    texinfo u-boot-tools \
    dosfstools mtools \
    parted gdisk \
    file
注意: 如果你用的是Ubuntu 22.04的Docker镜像,记得先装 locales 并设置 UTF-8 编码。否则编译时会出现奇怪的字符编码错误。我曾经因为这个排查了整整一下午。

2.2 交叉编译工具链安装

交叉编译工具链,说白了就是在一台x86电脑上编译出能在ARM芯片上跑的程序。Rockchip官方推荐使用ARM GCC工具链,版本是 gcc-arm-10.3-2021.07。

为什么选这个版本?我试过更新的11.x和12.x,编译Linux内核时偶尔会报一些奇怪的警告,虽然不影响功能,但看着烦。10.3这个版本经过Rockchip官方验证,最稳。

2.2.1 下载与解压

# 创建工具链目录
mkdir -p ~/toolchain
cd ~/toolchain

# 下载ARM GCC 10.3
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

# 解压
tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz

2.2.2 配置环境变量

我个人习惯把工具链路径加到 ~/.bashrc 里,这样每次打开终端自动生效。

echo 'export PATH=$PATH:~/toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin' >> ~/.bashrc
source ~/.bashrc

# 验证安装
aarch64-none-linux-gnu-gcc --version

如果看到输出类似 gcc version 10.3.1 20210621 (GNU Toolchain for the A-profile Architecture 10.3-2021.07),说明安装成功。

避坑指南: 我曾经遇到过明明装了工具链,但编译时提示找不到编译器。后来发现是64位系统缺少32位库。如果你遇到类似问题,执行:sudo apt install libc6-i386 lib32stdc++6

2.3 Repo与Git管理SDK

Rockchip的SDK体量很大,包含U-Boot、Linux内核、Buildroot、RKNN等多个仓库。如果用传统的git submodule管理,你会疯掉的——依赖关系太复杂了。

Repo是Google为Android开发的多仓库管理工具,Rockchip借鉴了这套方案。你想想看,一个 repo sync 就能拉下几十个仓库,是不是很爽?

2.3.1 安装Repo

# 下载Repo脚本
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

# 添加到PATH
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc
网络问题: 如果Google的地址下载不了,可以用清华源的镜像:curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo

2.3.2 初始化SDK

以RK3588为例,Rockchip官方SDK的manifest文件在GitHub上。

# 创建工作目录
mkdir -p ~/rk3588_sdk
cd ~/rk3588_sdk

# 初始化Repo
repo init -u https://github.com/rockchip-linux/manifests.git -b master -m rk3588_linux.xml

# 同步代码(这一步很耗时,建议用 -j4 或 -j8 加速)
repo sync -j8 --no-tags

同步完成后,你会看到类似这样的目录结构:

目录/文件 说明
u-boot/ U-Boot引导加载程序
kernel/ Linux内核源码(5.10或6.1)
buildroot/ Buildroot根文件系统构建
rkbin/ Rockchip闭源二进制文件(DDR初始化、M0固件等)
device/rockchip/ 设备树、板级配置、分区表
external/ 第三方库和工具
docs/ 官方文档和Release Notes

2.3.3 Repo常用操作

刚开始用Repo时,我总记不住命令。后来总结了一张速查表,贴在我的显示器边上。

命令 作用 使用场景
repo sync -j8 同步所有仓库到最新 每天开始工作前执行
repo start <branch> --all 在所有仓库创建新分支 开始一个新功能开发
repo status 查看所有仓库的修改状态 检查哪些文件被改了
repo diff 查看所有仓库的差异 提交前做代码审查
repo upload 提交代码到Gerrit审核 团队协作时使用
repo forall -c "git log --oneline -5" 在所有仓库执行git命令 批量操作,比如查看最近提交
重要提醒: 不要在 repo sync 过程中强制中断!我有个同事因为网络不好,Ctrl+C了三次,结果manifest文件损坏,所有仓库状态混乱,最后只能删掉重来。如果网络慢,用 repo sync -j4 降低并发数。

2.4 环境验证

环境搭好了,我们来验证一下。写一个简单的Hello World,交叉编译后在目标板上运行。

# 创建测试文件
cat > hello.c << 'EOF'
#include <stdio.h>

int main() {
    printf("Hello from Rockchip!\n");
    return 0;
}
EOF

# 交叉编译
aarch64-none-linux-gnu-gcc -o hello hello.c

# 查看文件信息
file hello
# 输出应为:hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV)

看到 ARM aarch64 就对了。把这个文件拷贝到开发板上,执行 ./hello,如果打印出 "Hello from Rockchip!",说明整个工具链环境完全OK。

我的经验: 环境搭建这一步,宁可多花半小时验证,也不要急着往下走。我见过太多人编译到一半发现工具链有问题,回头排查环境,浪费的时间是搭建时的三倍。
开发环境搭建知识结构 Ubuntu 22.04 基础环境 交叉编译工具链 Repo与Git管理SDK 换源(清华/中科大) 安装必备软件包 Python3 / 依赖库 ARM GCC 10.3 下载 解压与PATH配置 验证:aarch64-gcc --version 安装Repo脚本 repo init + repo sync 分支管理 / 状态查看 环境验证:交叉编译Hello World 💡 三个模块缺一不可,建议按顺序搭建,每步验证通过后再继续

环境搭建到这里就完成了。你可能会问:为什么不用Docker?嗯,Docker确实方便,但做内核移植时经常需要操作USB设备、挂载分区、烧录固件,这些在容器里搞起来很麻烦。我个人建议至少在开发阶段用原生系统,等流程稳定了再考虑容器化。