嵌入式 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 源码不会被修改,放心编译
相关推荐
AOwhisky2 小时前
Linux(CentOS)系统管理入门笔记(第二十一期)——防火墙管理(Firewalld)——zone、服务端口、富规则与端口转发
linux·运维·笔记·安全·centos·防火墙
腾飞开源2 小时前
01_K8s干货笔记之认识K8s
运维·笔记·云原生·容器·kubernetes·k8s·容器化部署
tg_xianheyun8 小时前
CDN节点分布如何影响网页加载速度和用户体验
服务器·cdn加速·全球访问优化
lsh曙光8 小时前
延时at指令和定时cron指令
linux·服务器·网络
圆山猫9 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
布鲁飞丝9 小时前
vivo Pulsar 万亿级消息处理实践()-Ansible运维部署
运维·ansible
XR1234567889 小时前
企业全光网络架构选型技术白皮书:从物理层到运维层的全链路分析
运维·网络·架构
似的8359 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
HiDev_9 小时前
【非标自动化】2、认识元器件(直线模组)
运维·自动化
夏殇之殁10 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript