Tauri Arm64 版本本地交叉编译实践

原文档: tauri.app/v1/guides/b...
本文档是在官方文档上结合本人开发实际形成的,只编译了ARM64,请具体问题具体分析
AppImages只能在ARM设备上构建。为了避免Tauri构建它,你可以在src-tauri文件夹中自定义tauri.conf.json。调整"targets"数组,只包含你的基于ARM的设备所需的平台。例如: "targets": ["deb", "nsis", "msi", "app", "dmg", "updater"], 或者,你可以在调用tauri build时使用--bundles标志。

交叉编译

现在,让我们交叉编译 ARM 的 Tauri 应用程序:

1. 为所需架构安装 Rust 目标:

  • 对于ARMv7 (32-bit): rustup target add armv7-unknown-linux-gnueabihf

  • 对于ARMv8 (ARM64, 64-bit): rustup target add aarch64-unknown-linux-gnu

2. 为所选架构安装相应的链接器:

  • 对于ARMv7: sudo apt install gcc-arm-linux-gnueabihf

  • 对于ARMv8 (ARM64): sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

3. 打开或创建 <project-root>/.cargo/config.toml 文件,并相应添加以下配置:

ini 复制代码
``` toml
[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
```

4. 在软件包管理器中启用相应的架构:

  • 对于ARMv7: sudo dpkg --add-architecture armhf

  • 对于ARMv8 (ARM64): sudo dpkg --add-architecture arm64

5. 调整软件包源

在 Debian 上,这一步应该是不必要的,但在其他发行版上,你可能需要编辑 /etc/apt/sources.list 以包含 ARM 架构变体。

例如,在 Ubuntu 22.04 上,在文件底部添加以下几行(记住用 Ubuntu 版本的代号替换 jammy):

shell 复制代码
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy main restricted
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main restricted
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy universe
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates universe
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy multiverse
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates multiverse
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-backports main restricted universe multiverse
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security main restricted
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security universe
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ubuntu-ports jammy-security multiverse

大陆地区如果网络连接不畅,建议使用镜像源,以下是清华镜像源的配置项

less 复制代码
    deb [arch=armhf,arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted
    deb [arch=armhf,arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted
    deb [arch=armhf,arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy universe
    deb [arch=armhf,arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates universe
    deb [arch=armhf,arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy multiverse
    deb [arch=armhf,arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates multiverse
    deb [arch=armhf,arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
    deb [arch=armhf,arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security main restricted
    deb [arch=armhf,arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security universe
    deb [arch=armhf,arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-security multiverse

然后,为了防止主软件包出现问题,你必须事先在文件包含的所有其他行中添加正确的主架构。对于标准的 64 位系统,您需要添加 [arch=amd64]

完成这些更改后,重新运行步骤 4 中的命令,验证软件包管理器中是否仍启用了 armhf/arm64 架构。

6. 更新软件包信息:

shell 复制代码
sudo apt-get update && sudo apt-get upgrade

7. 为所选架构安装所需的 webkitgtk 库:

  • 对于ARMv7: sudo apt install libwebkit2gtk-4.0-dev:armhf

  • 对于ARMv8 (ARM64): sudo apt install libwebkit2gtk-4.0-dev:arm64

8. 安装 OpenSSL 或使用供应商版本:

  • 在全系统范围内安装开发头文件:

    • 对于ARMv7: sudo apt install libssl-dev-dev:armhf

    • 对于ARMv8 (ARM64): sudo apt install libssl-dev-dev:arm64

  • 为 OpenSSL Rust crate 启用vendor功能,这将影响使用相同次版本的所有其他 Rust 依赖项。您可以将此添加到 Cargo.toml 文件的依赖项部分:

toml 复制代码
    openssl-sys = {version = "0.9", features = ["vendored"]}

9. 根据所选架构,将 PKG_CONFIG_SYSROOT_DIR 设置为适当的目录:

该环境变量在终端结束后会清除,如有需要可以放到 shell 配置文件里

  • 对于ARMv7: export PKG_CONFIG_SYSROOT_DIR=/usr/arm-linux-gnueabihf/

  • 对于ARMv8 (ARM64): export PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu/

10. 为所需的 ARM 版本构建应用程序::

  • 对于ARMv7: cargo tauri build --target armv7-unknown-linux-gnueabihf

  • 对于ARMv8 (ARM64): cargo tauri build --target aarch64-unknown-linux-gnu

npm 、 yarn、pnpm 可以使用 npm/yarn/pnpm tauri build --target aarch64-unknown-linux-gnu

可能出现的问题

开发过程中我将 /usr/bin/aarch64-linux-gnu-gcc 软连接到了 /usr/lib/gcc-cross/aarch64-linux-gnu/11/ ,所以可能解决的方式不适用于所有情况: sudo ln -ssudo ln -s /usr/bin/aarch64-linux-gnu-gcc /usr/lib/gcc-cross/aarch64-linux-gnu/11/

1. error: linking with `cc` failed: exit status: 1

  • gcc-aarch64-linux-gnu没安装

  • export PKG_CONFIG_SYSROOT_DIR=/usr/aarch64-linux-gnu/没在终端使用后设置

  • config.toml文件没有保存对,是 ++/.cargo/config.toml++ 的config.toml 文件,不是 src-tauri/cargo.toml文件

2. /usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: cannot find -lstdc++: No such file or directory

终端输入:find /usr/lib -name libgcc.a

shell 复制代码
    find /usr/lib -name libgcc.a
    
    # 期望的输出
    # /usr/lib/gcc-cross/aarch64-linux-gnu/11/libgcc.a
    # /usr/lib/gcc/x86_64-linux-gnu/11/libgcc.a

如果只有amd64环境下的 libgcc 则需要安装 g++-aarch64-linux-gnu

shell 复制代码
    sudo apt update
    sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

3. /usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld: cannot find -libasound: No such file or directory

终端输入: find /usr/ -name libasound.so

shell 复制代码
    find /usr/ -name libasound.so                                                 
    
    # 期望的输出
    # /usr/lib/x86_64-linux-gnu/libasound.so
    # /usr/aarch64-linux-gnu/lib/libasound.so

由于本人没有找到aarch64版本的libasound.so库,考虑从源码安装

shell 复制代码
    # 1.下载ALSA库的源代码:
      wget ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.2.4.tar.bz2
    # 2.解压源代码:
      tar xjf alsa-lib-1.2.4.tar.bz2
      cd alsa-lib-1.2.4
    # 3.配置构建系统:
      ./configure --host=aarch64-linux-gnu --prefix=/usr/aarch64-linux-gnu/
    # 4.编译和安装库:
      make
      sudo make install

这些命令会在/usr/aarch64-linux-gnu/lib/目录下安装libasound库。你应该能在这个目录下找到libasound.so文件。

相关推荐
桂月二二4 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
hunter2062066 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb6 小时前
web服务器 网站部署的架构
服务器·前端·架构
刻刻帝的海角6 小时前
CSS 颜色
前端·css
九酒6 小时前
从UI稿到代码优化,看Trae AI 编辑器如何帮助开发者提效
前端·trae
浪浪山小白兔7 小时前
HTML5 新表单属性详解
前端·html·html5
lee5767 小时前
npm run dev 时直接打开Chrome浏览器
前端·chrome·npm
2401_897579657 小时前
AI赋能Flutter开发:ScriptEcho助你高效构建跨端应用
前端·人工智能·flutter
limit for me8 小时前
react上增加错误边界 当存在错误时 不会显示白屏
前端·react.js·前端框架
浏览器爱好者8 小时前
如何构建一个简单的React应用?
前端·react.js·前端框架