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的镜像,放心用,完全没问题。
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 开发环境核心结构图
下面这张图展示了整个开发环境的层次关系,从宿主机到目标板,每一层都有对应的工具和配置。我建议你把它存下来,后面每次遇到环境问题,都可以回来对照着排查。
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,装一下就好。
elf.h找不到。查了半天才发现是libelf-dev没装。这个包在20.04上是默认安装的,但22.04的桌面版居然没有预装。从那以后,我每次搭环境都会严格按照上面的命令列表来,一个都不跳过。
环境搭好了,工具链也配好了。接下来就可以正式开始内核编译和驱动开发了。记住,环境搭建这一步花的时间,后面都会加倍省回来。