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

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

我正在尝试在相同 OS.

的 x86 主机上为 armv7 在 Debian Buster 上构建一个项目 (https://wpewebkit.org/)

我能够成功安装 arm C++ 工具链,并且我能够成功编译和 运行 普通应用程序。

我被困的地方是我想编译的许多项目需要很多依赖项,我通常通过 OS 的包管理器(例如 apt-get install libjpeg-dev)安装这些依赖项。交叉编译时,看起来我可以下载 & make install 我需要的源代码。但是,这个项目有数百个依赖项——下载和编译所有这些依赖项需要很长时间。同时这些依赖的arm版本已经存在apt for arm.

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

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

可以用dpkg --root安装。如果您有一个完整的环境,您可以 chroot arm_root 然后使用主机二进制文件和 ARM 开发文件(头文件和库)构建包。

The Debian maint-guide is an overview of building debian packages for the normal case. The Debian cross-compile wiki 使用 chroot 方法并参考使用 sbuildpbuild 包进行构建。 schroot 包非常好,因为它允许您在不成为 root 的情况下构建影子文件系统。在学习 跨发行版构建 时很容易破坏主机文件系统,我强烈推荐这种方法。 maint-guidecross wiki 之间的另一个主要区别是安装包 cross build essentials

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

否则,除了使用 chroot 影子 ARM 文件系统构建之外,几乎所有内容都是相同的。

这是Ubuntu hosts翻译...你需要Zenial或更好的才能使用交叉编译debian维基方法。即,Ubuntu x86 Bionic build for raspberry PI 或类似的。这种方法可以为您处理很多事情,尤其是防止错误地损坏文件系统;感谢 Debian 的好心人。


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

  • build表示chroot/dpkg/compiler的可执行文件的架构,即build[=71=的架构] 系统(被 cmake/kernel/etc 称为主机)

  • host 表示生成的可执行对象的体系结构,即这些来宾对象所在的 host 系统的体系结构将 运行 开启(称为目标或有时在其他地方构建)

  • target是produced executable objects在生成可执行对象时会生成的,即构建程序的系统架构target 他们的结果 运行 上(仅与编译器和类似的相关)

人们在交叉构建中更改相同概念的名称,这可能会造成混淆。

附加信息

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

我最后做的是使用 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 二进制文件。