如何为在 x86 主机上为 arm 目标交叉编译的项目安装依赖项

How to install dependencies for a project that is being cross-compiled on an x86 host for an arm target

本文关键字:交叉编译 项目 依赖 目标 安装 arm x86 主机      更新时间:2023-10-16

我正在尝试在 Debian Buster 上为同一操作系统的 x86 主机上的 armv7 构建一个项目 (https://wpewebkit.org/(。

我能够成功地安装一个 arm C++工具链,我可以成功地编译和运行琐碎的应用程序。

我陷入困境的是,我想要编译的许多项目都需要许多依赖项,这些依赖项通常通过操作系统的包管理器(例如apt-get install libjpeg-dev(安装。交叉编译时,看起来我可以下载并make install我需要的源代码。但是,该项目有数百个依赖项 - 下载和编译所有这些依赖项需要很长时间。同时,这些依赖项的 arm 版本已经存在于aptfor arm 中。

如何在主机系统上安装这些依赖项的 armhf 版本并使它们可用于我的交叉编译工具链?我已经尝试dpkg add-architecture armhf然后通过apt-get install libjpeg-dev:armhf安装,但 cmake 似乎找不到已安装的依赖项。

@artless噪音指南是一个很好的起点,但不幸的是,大多数指南对完成我想做的事情没有帮助(或者如果是,他们也不直接解释如何完成我需要的事情(。

我最终做的是使用qemu-debootstrap

sudo qemu-debootstrap --arch armhf buster /mnt/data/armhf http://deb.debian.org/debian/

然后只需使用sudo chroot /mnt/data/armhf,我就有一个正常运行的 shell,我可以在其中apt-get我需要的任何内容,运行任何脚本并获取 armhf 二进制文件。

有很多方法可以做到这一点。关键概念是,您需要一个模仿 ARM 的影子文件系统,并且您需要告诉包构建机制它们的位置。 有许多发行版变体LTIB是基于rpm的,Yocto使用BitBake并支持deb,rpm和ipkg。 此外,还需要区分生成工具和已部署的二进制文件。 这是交叉编译时添加的概念。 上面唯一的一点是,Ltib,Yocto,buildroot等都保留了一个影子根文件系统和一些保存主机/构建二进制文件的地方。 既然你有一个 Debian 系统,最好坚持使用他们的工具。

可以使用dpkg --root进行安装。如果你有一个完整的环境,则可以chroot arm_root,然后使用主机二进制文件但 ARM 开发文件(标头和库(生成包。

Debian 维护指南是为正常情况构建 debian 软件包的概述。Debian 交叉编译 wiki 使用chroot方法,并引用了使用sbuildpbuild软件包进行构建。schroot包非常好,因为它允许您在不成为 root 用户的情况下构建影子文件系统。 在学习跨发行版构建时,很容易破坏主机文件系统,我强烈推荐这种方法。维护指南和跨wiki之间的另一个关键区别是安装软件包跨构建要点

sudo apt-get install build-essential crossbuild-essential-armhf

否则,大多数内容都是一样的,但使用chroot影子 ARM 文件系统进行构建。

这是 Ubuntu 主机的翻译...你需要 Zenial 或更好的Zenial来使用交叉编译的 debian wiki 方法。即,用于Raspberry PI或类似产品的Ubuntu x86 Bionic构建。此方法为您处理了很多事情,尤其是防止文件系统错误损坏;感谢 Debian 的善良灵魂。


命名法下的信息非常重要,

  • build是指 chroot/dpkg/compiler 可执行文件的架构,即构建系统的架构(由 cmake/kernel/etc 称为 host(

  • host是指生成的可执行对象的体系结构,即运行这些来宾对象的主机系统的体系结构(称为 target,有时在其他地方构建(

  • 目标是生成的可执行对象
  • 在生成可执行对象时将生成的内容,即构建的程序针对其结果运行的系统的体系结构(仅与编译器和类似程序相关(

人们在交叉建筑中更改相同概念的名称,这可能会令人困惑。

附加信息

  • 内核交叉构建
  • 介子交叉编译
  • 叮当交叉编译