开发环境搭建: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验证,遇到问题容易搜到解决方案
第一步:安装必要软件包
系统装好之后,第一件事就是装软件包。别一个一个手动装,我习惯写个脚本一把梭。下面这个列表是我反复验证过的,缺一不可:
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
装完之后,验证一下关键工具是否正常:
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'。这样平时测试小代码时敲起来方便很多。
环境搭建知识体系
下面这张图把整个环境搭建的脉络梳理清楚了,你可以对照着检查自己有没有遗漏:
常见问题与避坑指南
| 问题现象 | 根本原因 | 解决方案 |
|---|---|---|
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,说明你的开发环境已经完全就绪了。