buildroot添加自定义应用过程
---## 场景设定我们要为嵌入式系统添加一个名为 hello-buildroot 的应用它会向控制台打印 Hello from Buildroot!。### 项目结构~/my_project/├── buildroot/ # Buildroot源码树└── app_src/ # 外部应用源码└── hello-buildroot/├── hello.c├── Makefile└── README---## 第一阶段准备应用源码### 1. 创建应用源码**创建应用目录**bashmkdir -p ~/my_project/app_src/hello-buildrootcd ~/my_project/app_src/hello-buildroot**编写 hello.c**c#include stdio.h#include unistd.hint main(int argc, char **argv) {int count 0;printf(Hello from Buildroot!\n);printf(Application running on: );// 打印系统信息#ifdef __linux__printf(Linux);#endif#ifdef __arm__printf( (ARM architecture));#endif#ifdef __x86_64__printf( (x86_64 architecture));#endifprintf(\n\n);// 每秒打印一次当前计数演示程序在运行while(1) {printf(Count: %d\n, count);sleep(1);}return 0;}**编写 Makefile**makefile# 交叉编译工具链变量将由Buildroot自动传入CC $(TARGET_CC)CFLAGS -Wall -O2LDFLAGS TARGET hello-buildrootSOURCES hello.cOBJECTS $(SOURCES:.c.o)all: $(TARGET)$(TARGET): $(OBJECTS)$(CC) $(CFLAGS) -o $ $^ $(LDFLAGS)%.o: %.c$(CC) $(CFLAGS) -c -o $ $clean:rm -f $(OBJECTS) $(TARGET)install:# 安装到目标系统由Buildroot的INSTALL_TARGET_CMDS处理echo Manual install handled by Buildroot.PHONY: all clean install---## 第二阶段创建Buildroot软件包### 2. 创建包目录结构bashcd ~/my_project/buildrootmkdir -p package/hello-buildroot### 3. 编写 Config.in在 package/hello-buildroot/Config.in 中添加kconfigconfig BR2_PACKAGE_HELLO_BUILDROOTbool hello-buildroothelpA simple demo application that prints Hello from Buildroot!This package demonstrates how to add a custom applicationto the Buildroot system.https://example.com/hello-buildroot### 4. 编写 hello-buildroot.mk这是最关键的文件定义如何构建和安装应用。makefile################################################################################# hello-buildroot################################################################################# 版本号可以是日期、git hash或自定义版本HELLO_BUILDROOT_VERSION 1.0.0# 源码位置使用本地源码外部目录HELLO_BUILDROOT_SITE $(TOPDIR)/../app_src/hello-buildrootHELLO_BUILDROOT_SITE_METHOD local# 许可证信息HELLO_BUILDROOT_LICENSE MITHELLO_BUILDROOT_LICENSE_FILES README# 依赖项如果有的话# HELLO_BUILDROOT_DEPENDENCIES libfoo libbar# 定义构建命令define HELLO_BUILDROOT_BUILD_CMDS# $(D) 是解压后的源码目录# 使用Buildroot的交叉编译工具链$(MAKE) CC$(TARGET_CC) LD$(TARGET_LD) \CFLAGS$(TARGET_CFLAGS) \LDFLAGS$(TARGET_LDFLAGS) \-C $(D) allendef# 定义安装到目标系统的命令define HELLO_BUILDROOT_INSTALL_TARGET_CMDS# 创建目标目录如果不存在mkdir -p $(TARGET_DIR)/usr/bin# 安装二进制文件$(INSTALL) -D -m 0755 $(D)/hello-buildroot $(TARGET_DIR)/usr/bin/hello-buildroot# 可选创建配置文件或数据文件# mkdir -p $(TARGET_DIR)/etc/hello# $(INSTALL) -D -m 0644 $(D)/hello.conf $(TARGET_DIR)/etc/hello/hello.confendef# 可选安装到 staging用于开发头文件/库# define HELLO_BUILDROOT_INSTALL_STAGING_CMDS# $(INSTALL) -D -m 0644 $(D)/hello.h $(STAGING_DIR)/usr/include/hello.h# endef# 注册包类型generic是最通用的$(eval $(generic-package))### 5. 将包注册到Buildroot主配置编辑 package/Config.in添加你的包bash# 在合适位置添加比如在 Custom packages 菜单下vi package/Config.in找到合适位置例如文件末尾添加kconfigmenu Custom packagessource package/hello-buildroot/Config.inendmenu---## 第三阶段构建系统### 6. 配置Buildroot进入Buildroot配置界面bashcd ~/my_project/buildroot# 如果没有配置过先选择目标平台以QEMU ARM为例make qemu_arm_vexpress_defconfig# 打开menuconfig选择你的应用make menuconfig在menuconfig中导航到Target packages ---Custom packages ---[*] hello-buildroot保存并退出。### 7. 构建整个系统bash# 开始构建首次会比较慢因为要下载很多依赖make构建完成后输出文件在 output/images/。---## 第四阶段验证安装### 8. 检查安装结果**查看构建日志**bash# 查看是否编译了hello-buildrootgrep hello-buildroot output/build/build-time.log# 查看安装的文件ls -la output/target/usr/bin/hello-buildrootfile output/target/usr/bin/hello-buildroot**查看根文件系统镜像内容**bash# 如果使用ext4格式mkdir -p /tmp/rootfs_checksudo mount -o loop output/images/rootfs.ext4 /tmp/rootfs_checkls -la /tmp/rootfs_check/usr/bin/hello-buildrootsudo umount /tmp/rootfs_check**查看最终的镜像大小**bashls -lh output/images/rootfs.*---## 第五阶段测试运行### 9. 在QEMU中测试假设使用ARM平台bash# 启动QEMU模拟器qemu-system-arm -M vexpress-a9 \-kernel output/images/zImage \-dtb output/images/vexpress-v2p-ca9.dtb \-append root/dev/mmcblk0 consolettyAMA0 \-drive fileoutput/images/rootfs.ext4,ifsd,formatraw \-nographic# 在QEMU中登录后运行应用# 用户名: root (无密码)/usr/bin/hello-buildroot预期输出Hello from Buildroot!Application running on: Linux (ARM architecture)Count: 0Count: 1Count: 2...---## 第六阶段调试与迭代### 10. 修改并重新编译应用当需要修改应用时bash# 1. 修改源码vi ~/my_project/app_src/hello-buildroot/hello.c# 2. 只重新编译你的应用不重建整个系统cd ~/my_project/buildrootrm -rf output/build/hello-buildroot-*make hello-buildroot# 3. 重新生成根文件系统镜像make ext4-rootfs# 4. 重新测试qemu-system-arm ... (同上)---## 完整脚本一键添加应用为了简化过程这里提供一个自动化脚本bash#!/bin/bash# 文件名: add-custom-app.shAPP_NAMEhello-buildrootAPP_SRC_DIR$HOME/my_project/app_src/$APP_NAMEBR_DIR$HOME/my_project/buildrootecho Step 1: Create application source...mkdir -p $APP_SRC_DIRcat $APP_SRC_DIR/hello.c EOF#include stdio.hint main() {printf(Hello from Buildroot!\n);return 0;}EOFcat $APP_SRC_DIR/Makefile EOFCC $(TARGET_CC)CFLAGS -Wall -O2TARGET hello-buildrootSOURCES hello.cOBJECTS $(SOURCES:.c.o)all: $(TARGET)$(TARGET): $(OBJECTS)$(CC) $(CFLAGS) -o $ $^clean:rm -f $(OBJECTS) $(TARGET).PHONY: all cleanEOFecho Step 2: Create Buildroot package...mkdir -p $BR_DIR/package/$APP_NAMEcat $BR_DIR/package/$APP_NAME/Config.in EOFconfig BR2_PACKAGE_HELLO_BUILDROOTbool hello-buildroothelpCustom demo application.EOFcat $BR_DIR/package/$APP_NAME/$APP_NAME.mk EOF################################################################################# hello-buildroot################################################################################HELLO_BUILDROOT_VERSION 1.0.0HELLO_BUILDROOT_SITE \$(TOPDIR)/../app_src/hello-buildrootHELLO_BUILDROOT_SITE_METHOD localHELLO_BUILDROOT_LICENSE MITdefine HELLO_BUILDROOT_BUILD_CMDS\$(MAKE) CC\$(TARGET_CC) -C \$(D) allendefdefine HELLO_BUILDROOT_INSTALL_TARGET_CMDS\$(INSTALL) -D -m 0755 \$(D)/hello-buildroot \$(TARGET_DIR)/usr/bin/hello-buildrootendef\$(eval \$(generic-package))EOFecho Step 3: Register package...if ! grep -q hello-buildroot $BR_DIR/package/Config.in; thenecho source package/hello-buildroot/Config.in $BR_DIR/package/Config.infiecho Done! Now run:echo cd $BR_DIRecho make menuconfig # Enable hello-buildrootecho make---## 关键概念总结| 步骤 | 文件/位置 | 作用 ||------|-----------|------|| 源码准备 | app_src/hello-buildroot/ | 应用程序源代码 || 包描述 | package/hello-buildroot/Config.in | 在menuconfig中显示选项 || 构建规则 | package/hello-buildroot/hello-buildroot.mk | 定义如何编译和安装 || 包注册 | package/Config.in | 让Buildroot知道你的包 || 输出位置 | output/target/ | 安装后的文件构建时 || 最终镜像 | output/images/rootfs.* | 可烧录的根文件系统镜像 |---## 常见陷阱与解决方案1. **问题**编译时找不到头文件**解决**在 .mk 文件中添加依赖makefileHELLO_BUILDROOT_DEPENDENCIES libfoo2. **问题**应用无法运行缺少共享库**解决**检查依赖并添加makefileHELLO_BUILDROOT_DEPENDENCIES libcurl openssl3. **问题**修改源码后 make 没有重新编译**解决**删除构建目录bashrm -rf output/build/hello-buildroot-*make hello-buildroot4. **问题**应用安装到了错误的位置**解决**检查 INSTALL_TARGET_CMDS 中的路径makefile$(INSTALL) -D -m 0755 $(D)/hello-buildroot $(TARGET_DIR)/usr/bin/hello-buildroot---## 拓展添加启动脚本如果想让应用开机自动运行可以添加启动脚本makefile# 在 hello-buildroot.mk 中添加define HELLO_BUILDROOT_INSTALL_INIT_SYSV$(INSTALL) -D -m 0755 package/hello-buildroot/S99hello \$(TARGET_DIR)/etc/init.d/S99helloendef创建 package/hello-buildroot/S99hellobash#!/bin/shcase $1 instart)echo Starting hello-buildroot.../usr/bin/hello-buildroot ;;stop)killall hello-buildroot;;esacexit 0这样应用就会在系统启动时自动运行了。---

相关新闻

Unity游戏模组开发入门:BepInEx框架原理、安装与插件开发实战

Unity游戏模组开发入门:BepInEx框架原理、安装与插件开发实战

1. 项目概述:为什么BepInEx是Unity游戏模组开发的基石如果你玩过基于Unity引擎开发的PC游戏,尤其是那些在Steam创意工坊里拥有海量玩家自制内容的作品,你大概率已经间接接触过BepInEx了。它不是一个直接面向玩家的工具,而是连接玩…

2026/10/14 19:04:00 阅读更多 →
L3级自动驾驶技术解析:从传感器融合到产业化落地路径

L3级自动驾驶技术解析:从传感器融合到产业化落地路径

这次我们来深入探讨华为智能汽车解决方案BU CEO靳玉志关于L3级自动驾驶的最新观点。靳玉志明确表示"L3无法跳过",这一判断对整个自动驾驶行业的发展路径具有重要指导意义。随着自动驾驶技术从L2向更高级别演进,法律法规完善与用户适应确实都需…

2026/10/14 4:21:09 阅读更多 →
C++构建图床云存储服务:从HTTP解析到JWT认证的完整实践

C++构建图床云存储服务:从HTTP解析到JWT认证的完整实践

1. 项目概述:从零构建一个C图床云存储服务最近在整理个人博客和项目文档时,图片管理一直是个头疼的问题。用第三方图床总担心服务不稳定或政策变化,自己搭又觉得太复杂。于是,我决定用C手搓一个轻量级的图床共享云存储服务&#x…

2026/10/9 7:11:03 阅读更多 →

最新新闻

前缀和与差分:从Sn到an,一篇文章讲透区间操作核心算法

前缀和与差分:从Sn到an,一篇文章讲透区间操作核心算法

刷算法题的时候,我经常看到有人一遇到“前缀和”“差分”就开始头皮发麻。原因倒也好理解:这两个词听起来像两座大山,好像没学过高等数学就翻不过去。但我想说,你真的被名字唬住了。这俩东西,本质就是你高中数列里天天…

2026/10/15 21:42:56 阅读更多 →
RESTful接口设计工程实践:从资源命名到落地规范

RESTful接口设计工程实践:从资源命名到落地规范

我到现在都记得刚带第一个中型项目的时候,前后端一起联调,光接口文档就维护了三个版本:后端自己写的接口说明、前端总结的字段字典、客户端团队小群里私下补的备注。每次产品提需求,大家第一反应不是讨论功能,而是问“…

2026/10/15 21:42:56 阅读更多 →
C#数据库增删改查实战:Access与SQL Server双路径落地

C#数据库增删改查实战:Access与SQL Server双路径落地

简介:本资源是一份面向C#初学者与ASP.NET入门开发者的数据库基础操作教学代码包,聚焦增删改查(CRUD)核心能力训练。内容以完整可运行的C#源码为主,涵盖OleDbConnection连接Access数据库、OleDbCommand执行参数化SQL语句…

2026/10/15 21:42:56 阅读更多 →
TensorFlow 2多算法对比:文本分类实战与选型指南

TensorFlow 2多算法对比:文本分类实战与选型指南

1. 文本分类这件事,为什么值得把多个算法放在一起跑文本分类算是自然语言处理里最接地气的一类任务了。情感分析、垃圾内容识别、工单自动路由、新闻频道归类,本质上都是把一段文本映射到一个预定义的类别标签上。很多刚入门的朋友跑通一个模型、看到准确…

2026/10/15 21:42:56 阅读更多 →
WOA-VMD鲸鱼算法优化变分模态分解:参数自动搜索与Python实现

WOA-VMD鲸鱼算法优化变分模态分解:参数自动搜索与Python实现

简介:本资源面向计算机、电子信息工程、数学等专业的学生与研究人员,提供一套Matlab实现的WOA-VMD鲸鱼算法优化变分模态分解完整方案,可用于课程设计、期末大作业与毕业设计,也适合作为信号处理方向的创新点。资源利用鲸鱼优化算法…

2026/10/15 21:42:56 阅读更多 →
YOLO-World开放词汇检测实战:架构拆解、训练策略与部署避坑指南

YOLO-World开放词汇检测实战:架构拆解、训练策略与部署避坑指南

简介:这份PDF资料聚焦YOLO-World开放词汇对象检测器的实现方式,面向已具备YOLO基础、希望深入理解视觉语言建模与跨模态检测的算法工程师和研究者。内容围绕架构组成、训练与预训练、推理过程及性能表现展开,重点讲解YOLO检测器、CLIP文本编码…

2026/10/15 21:41:56 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →