在交叉编译 Linux 工程(如 busybox、某些文件系统工具或支持 ACL 的应用)时,常会遇到如下报错:
bashfatal error: sys/acl.h: No such file or directory
这是因为交叉编译工具链的 sysroot 中缺少 ACL 库的头文件或库文件。本文记录一种解决方案。
打开 https://packages.ubuntu.com/ 在搜索框里输入:
libacl
很快能查到与 ACL 相关的两个关键包:
开发需要的是 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
到临时目录bashmkdir -p /tmp/libacl_dev
dpkg-deb -x libacl1-dev_2.2.53-10_arm64.deb /tmp/libacl_dev
或者用 ar
命令:
bashmkdir -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的库文件复制进去。
将头文件和库复制进去操作命令:
bashsudo 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>
缺失的问题,但存在以下 风险和弊端:
版本不匹配
依赖链不完整
污染工具链环境
下面是更稳妥的做法:
若在 x86_64 主机上交叉编译 ARM,可通过 apt
安装 arm64 包:
bashdpkg --add-architecture arm64 apt update apt install libacl1-dev:arm64
然后从 /usr/arm-linux-gnueabihf/include/
等路径中获取文件。
如果有目标系统的 rootfs,直接用 rootfs 作为 sysroot:
bash--sysroot=/path/to/rootfs
这样所有头文件和库都与目标系统一致。
针对嵌入式,Yocto、Buildroot 都能自动生成全套交叉环境:
本文作者:phae
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!