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文件。

相关推荐
编程零零七2 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
(⊙o⊙)~哦4 小时前
JavaScript substring() 方法
前端
无心使然云中漫步4 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者5 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
xnian_5 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js
麒麟而非淇淋6 小时前
AJAX 入门 day1
前端·javascript·ajax
2401_858120536 小时前
深入理解MATLAB中的事件处理机制
前端·javascript·matlab
阿树梢6 小时前
【Vue】VueRouter路由
前端·javascript·vue.js
随笔写7 小时前
vue使用关于speak-tss插件的详细介绍
前端·javascript·vue.js
史努比.8 小时前
redis群集三种模式:主从复制、哨兵、集群
前端·bootstrap·html