开发环境搭建:Ubuntu 22.04配置、交叉编译工具链安装

说实话,做嵌入式Linux开发,环境搭建往往是第一个坑。我见过不少新手,代码写得挺溜,结果卡在环境配置上好几天。这一章,咱们就把Rockchip平台开发的基础环境彻底搞定。

为什么选择Ubuntu 22.04 LTS?

你可能要问:为什么非得是22.04?我用20.04或者Debian不行吗?

我的回答是:当然可以,但22.04是目前最省心的选择。原因有三:

  • 软件包版本够新:gcc、make、python3等基础工具版本适中,不会太老导致编译失败,也不会太新引入兼容性问题
  • LTS长期支持:到2027年才结束支持,项目周期内不用折腾系统升级
  • 社区生态成熟:Rockchip官方SDK和第三方文档大多基于22.04验证,遇到问题容易搜到解决方案
我的建议:如果你用的是Windows,别想着在WSL里搞。WSL2虽然能用,但USB设备透传、串口访问这些操作会让你抓狂。老老实实装双系统或者用一台独立Linux机器,省心得多。

第一步:安装必要软件包

系统装好之后,第一件事就是装软件包。别一个一个手动装,我习惯写个脚本一把梭。下面这个列表是我反复验证过的,缺一不可:

sudo apt update
sudo apt install -y \
    git \
    make \
    gcc \
    g++ \
    libncurses5-dev \
    libssl-dev \
    bc \
    flex \
    bison \
    libelf-dev \
    python3 \
    python3-pip \
    python3-dev \
    device-tree-compiler \
    u-boot-tools \
    cpio \
    rsync \
    kmod \
    liblz4-tool \
    libzstd-dev \
    pkg-config \
    autoconf \
    automake \
    libtool \
    curl \
    wget \
    vim \
    tree
注意:libncurses5-dev和libssl-dev这两个特别容易漏掉。没有它们,内核的menuconfig配置界面根本打不开。我曾经帮一个同事排查了半天,最后发现就是少了libncurses5-dev。

装完之后,验证一下关键工具是否正常:

gcc --version
make --version
python3 --version
dtc --version

第二步:安装交叉编译工具链

这是整个环境搭建的核心。Rockchip平台是ARM架构,而我们的开发机是x86_64,所以需要交叉编译工具链——说白了,就是在x86机器上编译出能在ARM芯片上跑的程序。

我推荐使用ARM官方发布的 gcc-arm-10.3-2021.07 版本。为什么是这个版本?因为Rockchip官方SDK(Linux SDK 1.8.0及之后版本)都基于这个工具链验证过,踩坑成本最低。

下载与解压

cd ~
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

解压完成后,你会得到一个 gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu 目录。我习惯把它放在 /opt/toolchains/ 下面:

sudo mkdir -p /opt/toolchains
sudo mv gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu /opt/toolchains/

配置环境变量

这一步很多人会忘。不配环境变量的话,每次编译都要写全路径,烦得很。我一般在 ~/.bashrc 里加一行:

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

验证一下是否生效:

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

如果看到版本信息输出,说明工具链安装成功。

关键点:交叉编译工具链的前缀是 aarch64-none-linux-gnu-,这意味着所有工具都带这个前缀。比如gcc是 aarch64-none-linux-gnu-gcc,ld是 aarch64-none-linux-gnu-ld。内核编译时,通过设置 CROSS_COMPILE 变量来指定这个前缀。

第三步:验证工具链与内核编译环境

工具链装好之后,我习惯写一个简单的测试程序,交叉编译一下,确保整个链路是通的:

cat > hello.c << 'EOF'
#include <stdio.h>

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

aarch64-none-linux-gnu-gcc -o hello hello.c
file hello

如果输出显示 ELF 64-bit LSB executable, ARM aarch64,说明交叉编译环境完全正常。

一个小技巧:我习惯把交叉编译工具链的路径加到 ~/.bashrc 的同时,也加一个别名:alias arm-gcc='aarch64-none-linux-gnu-gcc'。这样平时测试小代码时敲起来方便很多。

环境搭建知识体系

下面这张图把整个环境搭建的脉络梳理清楚了,你可以对照着检查自己有没有遗漏:

Rockchip 开发环境搭建核心流程 宿主机:Ubuntu 22.04 基础软件包:git, make, gcc, python3, dtc... 交叉编译工具链 gcc-arm-10.3-2021.07 (aarch64-none-linux-gnu-) 环境变量:export PATH 验证:file hello 常见问题 • 缺少libncurses5-dev • PATH未正确配置 • 工具链版本不匹配 每个步骤都经过Rockchip RK3568/RK3588平台验证

常见问题与避坑指南

问题现象 根本原因 解决方案
make menuconfig 报错 缺少 libncurses5-dev sudo apt install libncurses5-dev
编译内核时报 Cannot use CONFIG_CC_STACKPROTECTOR_STRONG gcc 版本不支持 stack protector 使用推荐的 gcc-arm-10.3 版本
aarch64-none-linux-gnu-gcc: command not found PATH 环境变量未配置 检查 ~/.bashrc 中的 export 语句
编译出来的内核无法启动 工具链与内核版本不匹配 统一使用 gcc-arm-10.3-2021.07
我曾经踩过的坑:有一次我图省事,直接用 apt install gcc-aarch64-linux-gnu 装了系统自带的交叉编译器。结果编译出来的内核在RK3568上启动到一半就挂了。查了两天才发现是工具链版本太老,某些ARMv8指令集支持不完整。从那以后,我再也不敢偷这个懒了。

验证环境是否就绪

最后,我建议你做一个完整的验证。写一个简单的内核模块,交叉编译一下,确保整个工具链链路都是通的:

cat > test_module.c << 'EOF'
#include <linux/module.h>
#include <linux/kernel.h>

static int __init test_init(void)
{
    pr_info("Rockchip environment test module loaded\n");
    return 0;
}

static void __exit test_exit(void)
{
    pr_info("Rockchip environment test module unloaded\n");
}

module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
EOF

# 编译(假设你已经有一个可用的内核源码树)
make -C /path/to/kernel M=$(pwd) ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- modules

如果能顺利生成 test_module.ko,说明你的开发环境已经完全就绪了。

总结一下:Ubuntu 22.04 + 必要软件包 + gcc-arm-10.3-2021.07 交叉编译工具链,这三样配齐了,Rockchip平台的内核开发环境就算搭好了。别嫌麻烦,这一步做扎实了,后面编译内核、调试驱动的时候能省下大把时间。