如何为在 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
方法并参考使用 sbuild
或 pbuild
包进行构建。 schroot
包非常好,因为它允许您在不成为 root 的情况下构建影子文件系统。在学习 跨发行版构建 时很容易破坏主机文件系统,我强烈推荐这种方法。 maint-guide 和 cross 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 二进制文件。
我正在尝试在相同 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
方法并参考使用 sbuild
或 pbuild
包进行构建。 schroot
包非常好,因为它允许您在不成为 root 的情况下构建影子文件系统。在学习 跨发行版构建 时很容易破坏主机文件系统,我强烈推荐这种方法。 maint-guide 和 cross 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 二进制文件。