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

时间:2019-10-11 20:35:52

标签: c++ arm debian cross-platform apt

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

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

卡住的地方是我要编译的许多项目都需要许多依赖关系,这些依赖关系通常是通过OS的程序包管理器(例如apt-get install libjpeg-dev)安装的。进行交叉编译时,好像可以下载并make install我需要的资源。但是,此项目具有数百个依赖关系-下载和编译所有依赖关系都将花费很长时间。同时,arm的apt中已经存在这些依赖项的arm版本。

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

2 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。关键概念是,您需要一个模仿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是为 normal 案例构建debian软件包的概述。 The Debian cross-compile wiki使用chroot方法,并参考使用sbuildpbuild软件包进行构建。 schroot软件包非常好,因为它允许您构建影子文件系统而无需成为root用户。在学习交叉分发版本时,销毁主机文件系统非常容易,我强烈建议您使用此方法。 维护指南跨维基的另一个主要区别是安装了跨构建要领包。

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

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

这是Ubuntu hosts翻译 ...您需要 Zenial 或更好的版本才能使用交叉编译debian wiki方法。即,用于树莓派或类似版本的Ubuntu x86 Bionic构建。该方法为您处理了很多事情,尤其是防止错误地损坏文件系统。感谢Debian的好心人。


命名下的信息非常重要,

  • build 表示chroot / dpkg / compiler可执行文件的体系结构,即 build 系统的体系结构(由cmake / kernel / etc称为主机)

  • 主机是指生成的可执行对象的体系结构,即这些访客对象将在其上运行的 host 系统的体系结构(称为目标或有时在其他位置构建) )

  • 目标是在生成可执行对象时将生成的可执行对象,即生成的程序目标在其上运行的系统的体系结构(

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

其他信息

答案 1 :(得分:1)

@ 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二进制文件。

相关问题