我试图在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似乎找不到已安装的依赖项。
答案 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
方法,并参考使用sbuild
或pbuild
软件包进行构建。 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二进制文件。