目录
[1.1 三个关键环境的区分](#1.1 三个关键环境的区分)
[1.2 为什么需要区分](#1.2 为什么需要区分)
[二、Buildroot vs Ubuntu](#二、Buildroot vs Ubuntu)
[2.1 核心区别](#2.1 核心区别)
[2.2 你采用的混合模式](#2.2 你采用的混合模式)
[三、SDK 目录结构](#三、SDK 目录结构)
[4.1 什么是交叉编译](#4.1 什么是交叉编译)
[4.2 工具链位置](#4.2 工具链位置)
[4.3 sysroot 的作用](#4.3 sysroot 的作用)
[6.1 系统编译(首次)](#6.1 系统编译(首次))
[6.2 应用编译(日常开发)](#6.2 应用编译(日常开发))
[6.3 编译产物](#6.3 编译产物)
[7.1 头文件找不到](#7.1 头文件找不到)
[7.2 库文件找不到](#7.2 库文件找不到)
[7.3 apt 锁占用](#7.3 apt 锁占用)
[八、Makefile 模板](#八、Makefile 模板)
一、开发环境概念
1.1 三个关键环境的区分
| 环境 | 作用 | 你的配置 |
|---|---|---|
| 编译环境 | 编译代码的地方 | Buildroot 编译环境(电脑上) |
| 运行环境 | 运行程序的地方 | Ubuntu 系统(开发板上) |
| 开发环境 | 写代码的地方 | Ubuntu 虚拟机(电脑上) |
1.2 为什么需要区分
写代码(电脑)→ 交叉编译(电脑)→ 传输 → 运行(开发板)
- 电脑是 x86 架构 ,开发板是 ARM 架构
- 不能直接在电脑上运行 ARM 程序
- 需要用交叉编译工具链在电脑上编译出 ARM 程序
二、Buildroot vs Ubuntu
2.1 核心区别
| 特性 | Buildroot | Ubuntu |
|---|---|---|
| 定位 | 嵌入式构建系统 | 通用操作系统 |
| 库来源 | 从源码编译 | 从 apt 仓库下载 |
| 瑞芯微库 | 有(SDK 自带源码) | 无(官方源没有) |
| 包管理 | 无 | apt |
| 体积 | 几十 MB | 几 GB |
| 适用场景 | 量产产品 | 开发调试 |
2.2 你采用的混合模式
电脑:Buildroot 编译环境(获得完整开发库)
开发板:Ubuntu 系统(方便调试,apt 装工具)
这是嵌入式 Linux 开发的最佳实践:
- ✅ 编译环境完整(所有依赖自动处理)
- ✅ 运行环境便利(可以 apt 装软件)
三、SDK 目录结构
rv1126-rv1109-linux/
├── buildroot/ # Buildroot 构建系统
│ └── output/ # 编译输出目录
│ └── rockchip_..._facial_gate/
│ ├── host/ # 交叉编译工具链 + sysroot
│ └── target/ # 目标根文件系统
├── kernel/ # Linux 内核源码
├── u-boot/ # Uboot 源码
├── device/ # 板级配置
├── external/ # 第三方库源码(rkmedia、rkaiq 等)
├── app/ # 应用示例
├── prebuilts/ # 预编译工具链
└── rockdev/ # 最终镜像输出
四、交叉编译工具链
4.1 什么是交叉编译
在 x86 电脑上编译出 ARM 开发板能运行的程序。
4.2 工具链位置
Buildroot 生成的工具链(推荐)
buildroot/output/.../host/bin/arm-linux-gnueabihf-g++
SDK 自带的工具链(备用)
prebuilts/gcc/.../arm-linux-gnueabihf-g++
4.3 sysroot 的作用
sysroot 是目标系统的根文件系统镜像,包含:
- 头文件(
usr/include/) - 库文件(
usr/lib/)
编译时,工具链会从这个目录查找依赖。
五、瑞芯微专用库
| 库 | 作用 |
|---|---|
| librkmedia | 多媒体处理(视频采集、编码、显示) |
| librkaiq | 图像质量调优(自动曝光、白平衡) |
| libeasymedia | 多媒体框架(底层封装) |
| librtsp | RTSP 流媒体协议 |
这些库不在 Ubuntu 官方源,需要从 SDK 获得。
六、编译流程
6.1 系统编译(首次)
./build.sh lunch # 选择板型
./build.sh allsave # 完整编译(2-3小时)
6.2 应用编译(日常开发)
用 Buildroot 环境编译应用
export PATH=.../host/bin:$PATH
arm-linux-gnueabihf-g++ -o app app.c -lrkmedia -lrkaiq
6.3 编译产物
| 文件 | 说明 |
|---|---|
rockdev/update.img |
完整固件(烧录用) |
rockdev/boot.img |
内核镜像 |
rockdev/rootfs.img |
根文件系统 |
七、常见问题解决
7.1 头文件找不到
查找头文件位置
find ~/rv1126/SDK_DIR -name "xxx.h"
添加到 CFLAGS
CFLAGS += -I/path/to/include
7.2 库文件找不到
查找库文件
find ~/rv1126/SDK_DIR -name "libxxx.so"
添加到 LDFLAGS
LDFLAGS += -L/path/to/lib -lxxx
7.3 apt 锁占用
sudo pkill apt
sudo rm /var/lib/dpkg/lock-frontend
八、Makefile 模板
交叉编译工具链
GCC := /path/to/arm-linux-gnueabihf-g++
头文件路径
CFLAGS := -I/path/to/include
库文件路径
LDFLAGS := -L/path/to/lib -lrkmedia -lrkaiq -lpthread
all: app
app: app.c
(GCC) ^ (CFLAGS) (LDFLAGS) -o $@
clean:
rm -f app
九、开发流程总结
┌─────────────────────────────────────────────────────────┐ │ 完整开发流程 │ ├─────────────────────────────────────────────────────────┤ │ 1. 获取 SDK(已解压) │ │ 2. 编译 Buildroot(获得编译环境)← 你现在在这里 │ │ 3. 编写应用程序代码 │ │ 4. 用 Buildroot 环境交叉编译 │ │ 5. 传到开发板运行测试 │ │ 6. 调试修改,重复 3-5 │ └─────────────────────────────────────────────────────────┘
十、核心要点
- 编译环境 ≠ 运行环境:电脑编译,板子运行
- Buildroot 提供编译环境,Ubuntu 提供运行环境
- 瑞芯微库需要从 SDK 获得,不在系统官方源
- 交叉编译工具链是连接电脑和板子的桥梁
- sysroot 包含了目标系统的所有开发文件
- 首次编译慢,但之后应用编译很快
- SDK 源码不会被修改,放心编译