Rust 中的交叉编译需要主机和目标架构依赖关系

问题描述 投票:0回答:1

我正在尝试弄清楚如何交叉编译我的 Rust 项目来为 ARM64 构建它。我已经设置了一个 Tauri v1 项目,并按照他们的官方文档了解如何配置我的 Ubuntu 22.04 amd64 机器以针对 ARM 进行交叉编译。它起作用了,我对我的小管道非常满意,它在 3 分钟内构建了我的发布包,而不是在我的 RPi 上花费了半小时。以下是可供参考的 Action 工作流程:build.yml.

不幸的是,由于输入法支持有问题,我不得不升级到 Tauri v2 alpha 才能得到修复。我设法迁移代码并在本地构建应用程序,但遇到了构建问题,因为由于所需的系统依赖项发生变化,管道不再工作。我尝试过

cross-rs
,但他们的镜像是在 Ubuntu 20.04 上构建的,并且没有向后移植:

  • libjavascriptcoregtk-4.1-dev
  • libsoup-3.0-dev
  • libwebkit2gtk-4.1-dev

然后,安装它们后,我的工作流程中出现了更多错误。它要么抱怨我没有这些包,同时构建需要它们的包(通过安装 deps 解决),要么在链接阶段出错,它找不到这些依赖项,但对于 ARM64 架构。同时,我意识到我无法同时安装 AMD64 和 ARM64 版本,因此我最终得到了一个可行的解决方案,首先构建安装了 AMD64 版本的包,然后使用缓存的文件使用 ARM64 版本构建最终的二进制文件。 工作流程

它有效,但需要两倍的时间,对我来说似乎真的很愚蠢,作为一个不太熟悉 Cargo 警告的人,我想知道我做错了什么。如果目标指定为 ARM,为什么使用 AMD64 库构建包?之前为什么能用?难道是 Tauri 开发人员在他们的货物清单中设置错误的东西吗?我非常感谢帮助我理解这个问题。

ubuntu rust cross-compiling rust-cargo tauri
1个回答
1
投票

我没有做过太多Linux系统的交叉编译。

但是根据我使用 macOS 和不同架构的经验,特别是

x86_64
arm64
,他们提供了三种方法来做到这一点:

npm run tauri build --target aarch64-apple-darwin
npm run tauri build --target x86_64-apple-darwin
npm run tauri build --target universal-apple-darwin

所以最后一个

universal-apple-darwin
的行为与您在问题中描述的完全一样,它构建了两次,并创建了fat二进制文件。

我意识到linux使用ELF二进制文件,所以过程略有不同。

无论如何,回到你的问题,我发现有一个解决方法可以减少此架构中的时间,那就是使用工作空间

这样,如果您将应用程序拆分为

library
main
应用程序,则每次修改 main 时都不需要重新编译库,反之亦然。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.