编辑
2025-06-23
其他
00

目录

方法一:离线安装
步骤一:在 Ubuntu 包搜索网站中查找对应包
步骤二:定位目标架构的交叉编译包
步骤三:解压 .deb 到临时目录
步骤四:复制头文件和库到交叉工具链
方法二:更安全、推荐的解决方案
1. 用多架构包管理器 (Multi-Arch)
2. 用 sysroot 镜像
3. 用 Yocto 或 Buildroot

在交叉编译 Linux 工程(如 busybox、某些文件系统工具或支持 ACL 的应用)时,常会遇到如下报错:

bash
fatal error: sys/acl.h: No such file or directory

这是因为交叉编译工具链的 sysroot 中缺少 ACL 库的头文件或库文件。本文记录一种解决方案。

方法一:离线安装

步骤一:在 Ubuntu 包搜索网站中查找对应包

打开 https://packages.ubuntu.com/ 在搜索框里输入:

libacl

很快能查到与 ACL 相关的两个关键包:

  • libacl1:运行时动态库
  • libacl1-dev:开发用头文件与静态库

开发需要的是 libacl1-dev,因为里面包含:

/usr/include/sys/acl.h /usr/include/acl/libacl.h

步骤二:定位目标架构的交叉编译包

如果是 ARM、aarch64、riscv64 等交叉编译,可以去:

http://ports.ubuntu.com/ubuntu-ports/pool/main/a/acl/

查找对应架构的 .deb 包。

例如,为 aarch64 下载:

libacl1-dev_2.2.53-10_arm64.deb

步骤三:解压 .deb 到临时目录

bash
mkdir -p /tmp/libacl_dev dpkg-deb -x libacl1-dev_2.2.53-10_arm64.deb /tmp/libacl_dev

或者用 ar 命令:

bash
mkdir -p /tmp/libacl_dev ar x libacl1-dev_2.2.53-10_arm64.deb tar -xf data.tar.xz -C /tmp/libacl_dev

不出意外能在 /tmp/libacl_dev 里看到:

/tmp/libacl_dev/usr/include/sys/acl.h /tmp/libacl_dev/usr/include/acl/libacl.h /tmp/libacl_dev/usr/lib/aarch64-linux-gnu/libacl.a ...

步骤四:复制头文件和库到交叉工具链

我的工具链 sysroot 路径为:

/opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc

找到sysroot下的usr目录,里面有include,lib,可能还会有lib64。注意看libc.a和libc.so在哪个目录,比如我的是在lib64,那就把/tmp/libacl_dev/usr/lib/aarch64-linux-gnu的库文件复制进去。

将头文件和库复制进去操作命令:

bash
sudo cp -r /tmp/libacl_dev/usr/include/* /opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/ sudo cp -r /tmp/libacl_dev/usr/lib/aarch64-linux-gnu/* /opt/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/lib64/

然后重新编译


注意:此方法潜在弊端

虽然这种方法能解决 <sys/acl.h> 缺失的问题,但存在以下 风险和弊端

版本不匹配

  • 从 Ubuntu 提取的头文件和库,与目标 Linux 系统版本、glibc、libc 版本可能不一致。编译时可能没问题,运行时却出错。

依赖链不完整

  • ACL 库依赖其他库(比如 libattr)。只复制 libacl 可能不够。

污染工具链环境

  • 手动 cp 文件到工具链,可能导致后续升级或维护困难。

方法二:更安全、推荐的解决方案

下面是更稳妥的做法:

1. 用多架构包管理器 (Multi-Arch)

若在 x86_64 主机上交叉编译 ARM,可通过 apt 安装 arm64 包:

bash
dpkg --add-architecture arm64 apt update apt install libacl1-dev:arm64

然后从 /usr/arm-linux-gnueabihf/include/ 等路径中获取文件。


2. 用 sysroot 镜像

如果有目标系统的 rootfs,直接用 rootfs 作为 sysroot:

bash
--sysroot=/path/to/rootfs

这样所有头文件和库都与目标系统一致。


3. 用 Yocto 或 Buildroot

针对嵌入式,Yocto、Buildroot 都能自动生成全套交叉环境:

  • sysroot 自动匹配
  • 不易出现版本错配问题

本文作者:phae

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!