我有一个正在工作的debian包,我想将其备份到当前版本的64位Raspberry Pi OS(而不是32位Raspbian(。
令人困惑的是,虽然Debian本身似乎对在自己的包中实现交叉构建很稳健,但关于树莓派操作系统(64位(包是如何构建的官方文档似乎要少得多。
由于我相对确定这应该是可能的,我问:
如何获取debian.dsc/debian规则,并在x86_64上构建64位树莓派操作系统64位兼容的图像
- 而不使用QEMU在arm64上实际构建图像
- 使用已知在aarch64上的sid上工作并且应该是可移植的现有debian包
- 确保它实际上是根据正确的Raspbian依赖项集构建的
我想这是一件相当标准的事情,我只是不知道如何做到。我很乐意使用容器和类似的技术,因为我可以很容易地将其与CI集成。
我不打算使用Arm64虚拟机,因为有问题的软件需要大约一个小时才能在x86_64服务器上进行本机构建和测试。
cco我已经和Raspbian名声的plugwash谈过了,正如这个问题的早期版本所表明的:关于Raspbian操作系统64位的遗传有很大的困惑:它不是Raspbian,也不是基于它的。但包括维基百科和RPi基金会在内的人自己将Raspberry Pi操作系统和Raspban混为一谈("Raspberrry Pi OS,前身为Raspbian"(,其仅为32位
sudo apt install crossbuild-essential-arm64
Linux主机上的此命令安装一个在AMD64计算机上运行的编译器,但会生成一个在ARM机器上运行的二进制文件。
这一行告诉编译器实际构建该体系结构的源代码:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
Image modules dtbs
特定于您的项目。它们可能有所不同。
至于您的Debian软件包,您无法将AMD64软件包转换为ARM软件包。如果RaspberryPi的包不存在于官方或某些第三方存储库中,则必须从源代码构建。
找到包的源代码,并以与RaspberryOS非常相似的方式构建它。
如果你的包有依赖项,它会变得稍微复杂一些。首先,在RaspberryPi上安装依赖项。然后,您应该在主机上设置一个sysroot
,它基本上是RaspberryPi上预装软件包的镜像。然后,在编译包时,应该将系统根地址提供给交叉编译器,以便它能够找到依赖项。
还有另一种方法,你可以把包的源代码放在RaspberryPi上,并在本地构建它,这可能需要很长时间才能基于源代码。只是有一种感觉,没有WebEngine模块的Qt源代码花了我48小时。但Qt很大。
总之,如果包二进制文件不在任何存储库中,则必须从源代码进行编译。
不同项目和可执行文件的交叉编译彼此非常相似。为了清楚地了解这个过程,寻找一些移植到RaspberryPi操作系统的其他项目可能是有益的。像Qt,android的TagLib,和。。。
首先,我来看看这里:https://github.com/Truelite/qt5custom寻找灵感。我检查了一下,那些纸条有效。然而,你可能会遇到完全"qemuless"的问题;例如,在QT的情况下,一些库需要添加到主机sysroot中,而qemu只是正确添加它们的最简单方法:在我看来,multiarch Debian在交叉编译领域存在一些缺陷,克服这些缺陷的最简单的方法是假装它是本机库。