如何为在 x86 主机上为 arm 目标交叉编译的项目安装依赖项
How to install dependencies for a project that is being cross-compiled on an x86 host for an arm target
我正在尝试在 Debian Buster 上为同一操作系统的 x86 主机上的 armv7 构建一个项目 (https://wpewebkit.org/(。
我能够成功地安装一个 arm C++工具链,我可以成功地编译和运行琐碎的应用程序。
我陷入困境的是,我想要编译的许多项目都需要许多依赖项,这些依赖项通常通过操作系统的包管理器(例如apt-get install libjpeg-dev
(安装。交叉编译时,看起来我可以下载并make install
我需要的源代码。但是,该项目有数百个依赖项 - 下载和编译所有这些依赖项需要很长时间。同时,这些依赖项的 arm 版本已经存在于apt
for 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
方法,并引用了使用sbuild
或pbuild
软件包进行构建。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,有时在其他地方构建(
目标是生成的可执行对象在生成可执行对象时将生成的内容,即构建的程序针对其结果运行的系统的体系结构(仅与编译器和类似程序相关(
人们在交叉建筑中更改相同概念的名称,这可能会令人困惑。
附加信息
- 内核交叉构建
- 介子交叉编译
- 叮当交叉编译
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 用于交叉编译和CMake的预处理器宏的单元测试
- 当我尝试通过 mingw 使用 CMake 和 SFML 库编译项目时出错
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 无法使用 aarch64-unknown-nto-qnx7.0.0-g++-5.4.0 编译器交叉编译 QNX 平台的
- LD:尝试编译项目时找不到架构x86_64符号
- 如何使用导出的函数交叉编译 DLL
- 如何在不需要LIBCD.lib的情况下在Visual Studio 6中编译C项目
- 交叉编译:特殊的交叉编译器还是只是带有选项 -march 的 gcc?
- 交叉编译时包括外部库
- 如何交叉编译C++文件
- SFML 交叉编译 for Windows on Linux.
- 使用 cmake 交叉编译 libwebsockets
- 如何为在 x86 主机上为 arm 目标交叉编译的项目安装依赖项
- Qt项目与自定义共享库交叉编译Qt
- 交叉编译自动制作项目?
- 如何有条件地为 Eclipse 中的交叉编译项目包含两个不同名称的相同版本的库
- 交叉编译从linux到windows的一个visual studio项目
- 交叉编译c++项目,通用ELF中的重定位(EM: 3)
- 我可以交叉编译我的AS3代码或Flex项目原生c++