嵌入式 Linux 开发知识总结

目录

一、开发环境概念

[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                                    │
└─────────────────────────────────────────────────────────┘

十、核心要点

  1. 编译环境 ≠ 运行环境:电脑编译,板子运行
  2. Buildroot 提供编译环境,Ubuntu 提供运行环境
  3. 瑞芯微库需要从 SDK 获得,不在系统官方源
  4. 交叉编译工具链是连接电脑和板子的桥梁
  5. sysroot 包含了目标系统的所有开发文件
  6. 首次编译慢,但之后应用编译很快
  7. SDK 源码不会被修改,放心编译
相关推荐
liguojun20254 小时前
篮球馆自动计时收费系统:从规则配置到自动结算的全流程拆解
java·大数据·运维·人工智能·物联网·1024程序员节
Promise微笑4 小时前
红外分辨率 160×120、320×240、384×288 与 640×480实战选型指南
大数据·运维·人工智能·物联网
顾喵5 小时前
PetaLinux 2017.4 实操指南:PREEMPT_RT实时补丁移植+Zynq PL中断UIO用户态配置(超完整避坑版)
linux
小樱花的樱花5 小时前
Linux 线程的创建
linux·c语言·开发语言
云飞云共享云桌面5 小时前
单机建模卡顿运维繁琐!中小型机械制造厂云飞云 3D 云桌面落地
运维·服务器·网络·3d·自动化·电脑·负载均衡
mounter6255 小时前
BPF 的进化史:从网络过滤器到 AI 时代的 Linux 核心引擎
linux·网络·人工智能·ebpf·linux kernel·kernel
YMWM_6 小时前
video.preset的值为null和ultrafast的区别
linux·video
zandy10116 小时前
体验家 XMPlus 批量操作与自动化工作流引擎:让大规模运营从手动执行走向规则驱动
大数据·运维·自动化
湿韵轮回6 小时前
LangChain LCEL,用 | 串联AI的魔法语言
服务器·人工智能·langchain
Sagittarius_A*7 小时前
Docker:渗透前置容器化核心基础
运维·安全·docker·容器