news 2026/4/17 17:46:26

Ubuntu 22.04 编译 RV1109 Buildroot 根文件系统,我踩过的这五个坑你千万别再踩了

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu 22.04 编译 RV1109 Buildroot 根文件系统,我踩过的这五个坑你千万别再踩了

Ubuntu 22.04 编译 RV1109 Buildroot 根文件系统避坑指南

最近在 Ubuntu 22.04 上为 RV1109 平台编译 Buildroot 根文件系统时,遇到了不少令人头疼的问题。作为刚从 Ubuntu 20.04 升级上来的开发者,我本以为只是简单的环境迁移,没想到新版系统带来了这么多编译陷阱。本文将分享我在这个过程中遇到的五个典型问题及其解决方案,希望能帮助其他开发者少走弯路。

1. 环境准备与基础配置

在开始编译 RV1109 的 Buildroot 根文件系统前,我们需要确保 Ubuntu 22.04 系统环境配置正确。以下是一些基础准备工作:

sudo apt update sudo apt install -y build-essential git bc bison flex libssl-dev \ libncurses5-dev u-boot-tools lzop debootstrap
  • 工具链选择:RV1109 通常使用 arm-rockchip830-linux-uclibcgnueabihf 工具链
  • Buildroot 版本:建议使用 Rockchip 官方提供的定制版本
  • 系统库兼容性:Ubuntu 22.04 默认使用较新的 glibc 和内核头文件,这可能导致一些兼容性问题

提示:建议在开始前创建一个干净的编译环境,可以使用 Docker 容器或虚拟机来隔离开发环境。

2. 典型编译问题与解决方案

2.1 SIGSTKSZ 宏定义冲突

问题现象

c-stack.c:55:26: error: missing binary operator before token "("

原因分析: Ubuntu 22.04 的 glibc 2.34+ 修改了 SIGSTKSZ 的定义方式,从宏改为动态获取,这与 Buildroot 中部分软件包的预期不符。

解决方案

  1. 定位 c-stack.c 文件:
find buildroot -name c-stack.c
  1. 修改文件内容:
#ifndef SIGSTKSZ # define SIGSTKSZ 16384 #elif HAVE_LIBSIGSEGV && SIGSTKSZ < 16384 /* 注释掉原有条件编译 */ # undef SIGSTKSZ # define SIGSTKSZ 16384 #endif

验证方法: 重新编译后,检查是否还会出现相同错误。

2.2 _STAT_VER 未定义错误

问题现象

libfakeroot.c:99:40: error: '_STAT_VER' undeclared

背景知识: 不同架构对 stat 系统调用的版本号定义不同,而新版本 Ubuntu 在某些情况下不会自动定义这个宏。

修复步骤

  1. 打开 libfakeroot.c 文件:
find buildroot -name libfakeroot.c
  1. 添加架构相关的定义:
#ifndef _STAT_VER #if defined (__aarch64__) #define _STAT_VER 0 #elif defined (__x86_64__) #define _STAT_VER 1 #else #define _STAT_VER 3 #endif #endif

注意事项

  • 对于 RV1109 这种 ARMv7 架构,通常使用 _STAT_VER 3
  • 修改后需要清理并重新编译 fakeroot 相关组件

2.3 fwriter_buffer 重复定义

错误信息

read_fs.o:(.bss+0x0): multiple definition of 'fwriter_buffer' mksquashfs.o:(.bss+0x400be8): first defined here

问题本质: 这是一个典型的链接器错误,表明同一个符号在多个目标文件中被重复定义。

解决方法

  1. 修改 mksquashfs.h 文件:
find buildroot -name "mksquashfs.h"
  1. 将变量声明改为 extern:
extern struct cache *bwriter_buffer, *fwriter_buffer;
  1. 注释掉 mksquashfs.c 中的定义:
// struct cache *bwriter_buffer, *fwriter_buffer;

原理说明: 通过将变量声明为 extern,我们告诉编译器这些变量在其他地方定义,避免了重复定义问题。

2.4 qfloat16.h 模板错误

编译错误

qfloat16.h: numeric_limits' is not a class template

根本原因: Qt 相关头文件缺少必要的 C++ 标准库头文件包含。

修复方案: 修改 qglobal.h 文件:

find buildroot -name qglobal.h

添加 limits 头文件包含:

#ifdef __cplusplus # include <type_traits> # include <cstddef> # include <utility> # include <limits> // 新增这一行 #endif

兼容性考虑: 这一修改不会影响其他功能,因为 numeric_limits 是标准 C++ 的一部分。

2.5 makedevs 设备节点创建失败

错误信息

makedevs: line 27: can't create node /dev/console: Operation not permitted

问题诊断: Ubuntu 22.04 自带的 fakeroot 版本(1.20.2)与 Buildroot 不兼容。

解决方案

  1. 更新 Buildroot 中的 fakeroot 软件包:
wget https://git.buildroot.net/buildroot/plain/package/fakeroot/fakeroot.mk wget https://git.buildroot.net/buildroot/plain/package/fakeroot/fakeroot.hash
  1. 替换原有文件并重新编译:
cp fakeroot.mk fakeroot.hash buildroot/package/fakeroot/ make clean && make

版本对比

版本兼容性主要改进
1.20.2基础功能
1.32.1修复设备节点创建问题

3. 系统级优化建议

除了解决具体编译问题外,还有一些系统级的优化措施可以提高编译成功率:

  1. 使用 ccache 加速编译
sudo apt install ccache export CCACHE_DIR="/path/to/ccache" export USE_CCACHE=1
  1. 设置合理的并行编译数
# 根据CPU核心数设置 export MAKEFLAGS="-j$(nproc)"
  1. 内存不足解决方案
  • 增加 swap 空间
  • 使用 zram 压缩内存
  • 限制并行任务数
  1. 网络问题处理
# 设置镜像源 export BR2_DL_DIR=/path/to/local/dl

4. 常见问题排查技巧

当遇到编译错误时,可以按照以下步骤进行排查:

  1. 错误定位

    • 仔细阅读错误信息,确定是哪个软件包出了问题
    • 检查错误发生的编译阶段(配置、编译、链接、安装)
  2. 日志分析

# 查看详细编译日志 make V=1
  1. 环境检查

    • 工具链路径是否正确
    • 依赖库版本是否匹配
    • 系统头文件路径是否包含正确
  2. 隔离测试

    • 单独编译出问题的软件包
    • 在最小化环境中复现问题
  3. 社区资源

    • Buildroot 邮件列表
    • Rockchip 开发者论坛
    • GitHub 相关 issue

5. 进阶技巧与最佳实践

经过多次项目实践,我总结出以下经验可以帮助提高 Buildroot 编译效率:

  1. 版本控制集成
# 使用 git 管理配置 git init git add board/rockchip/rv1109/ defconfig/ git commit -m "Initial RV1109 configuration"
  1. 自定义软件包

    • 创建 package/your-package/ 目录
    • 编写 Config.in 和 your-package.mk
    • 集成到 Buildroot 构建系统
  2. 构建后脚本

# board/rockchip/rv1109/post-build.sh #!/bin/sh # 添加自定义文件 cp ${BINARIES_DIR}/your-file ${TARGET_DIR}/etc/
  1. 镜像优化技巧

    • 使用 squashfs 压缩根文件系统
    • 移除不必要的调试符号
    • 优化启动参数
  2. 调试工具集成

# 在 defconfig 中启用 BR2_PACKAGE_GDB=y BR2_PACKAGE_STRACE=y

在实际项目中,我发现保持 Buildroot 树外构建(out-of-tree build)可以大大提高开发效率。通过以下命令可以快速切换不同配置:

make O=../rv1109-build -C buildroot rockchip_rv1109_defconfig cd ../rv1109-build make

对于团队协作开发,建议将以下内容纳入版本控制:

  • 板级支持包(board/目录)
  • 自定义 defconfig
  • 补丁文件
  • 后处理脚本

而应该忽略:

  • dl/ 目录内容
  • output/ 构建输出
  • .config 文件(通过 defconfig 管理)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 17:41:14

活动目录使用备忘单

活动目录使用备忘单 包含 Windows 活动目录的常见枚举和攻击方法的备忘单。 工具 Powersploit PowerUpSQL Powermad Impacket Mimikatz Rubeus - >编译版本

作者头像 李华
网站建设 2026/4/17 17:38:26

从信令到连接:深入解析LTE RRC消息流程与网络交互

1. 手机开机的第一声问候&#xff1a;MIB/SIB广播机制 当你按下手机电源键的那一刻&#xff0c;一场精密的网络握手仪式就悄然开始了。就像新生入学要先听校长广播一样&#xff0c;手机首先要接收基站发送的MIB&#xff08;Master Information Block&#xff09;和SIB&#xff…

作者头像 李华
网站建设 2026/4/17 17:35:02

实测像素剧本圣殿:一键生成专业格式剧本,创作效率翻倍

实测像素剧本圣殿&#xff1a;一键生成专业格式剧本&#xff0c;创作效率翻倍 1. 创作痛点与解决方案 作为一名影视编剧&#xff0c;我每天都要面对空白的文档和闪烁的光标。传统剧本创作需要手动处理大量格式细节&#xff1a;场景标题、角色对话、动作描述...这些机械性工作…

作者头像 李华
网站建设 2026/4/17 17:35:02

联邦滤波器实战:从零搭建一个多传感器融合系统(附Python代码)

联邦滤波器实战&#xff1a;从零搭建一个多传感器融合系统&#xff08;附Python代码&#xff09; 在自动驾驶、机器人导航和工业监测等领域&#xff0c;多传感器数据融合是提升系统可靠性的核心技术。联邦滤波器作为一种分布式滤波架构&#xff0c;能够有效整合来自不同传感器的…

作者头像 李华