原文档: 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
文件。