Tauri 2 适配 Windows 7

如果希望使用 Tauri 2 开发一个同时兼容 Windows 7 的桌面应用,可以通过 Rust + VC-LTL5 + YY-Thunks 的方式解决新版本 Rust 对旧版 Windows API 的兼容问题。

本文记录一套实际测试成功的配置。

1. 前置条件

本文测试环境:

1
2
3
Tauri       2.11.1
Rust        1.97.1 (MSVC)
Windows     Windows 10 19045 x64 (Dev) / Windows 7 SP1 x64

1.1 Rust + MSVC环境

这个一般都有,就TLDR了。这里直接安装 VS2026。

1.2 VC-LTL5+YY-Thunks

这个一般没有,所以我们需要进行安装。

因为我自己的Scoop Bucket已经有了,所以我使用Scoop来安装:

1
2
scoop bucket add https://github.com/xrgzs/sdoog.git
scoop install sdoog/vc-ltl sdoog/yy-thunks

1.3 创建 Tauri 2 项目

创建一个普通的 Tauri 2 项目:

1
pnpm create tauri-app

正常创建完成后,Tauri 的 src-tauri/Cargo.toml 类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[package]
name = "tauri-app"
version = "0.1.0"
description = "A Tauri App"
authors = ["you"]
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[lib]
# The `_lib` suffix may seem redundant but it is necessary
# to make the lib name unique and wouldn't conflict with the bin name.
# This seems to be only an issue on Windows, see https://github.com/rust-lang/cargo/issues/8519
name = "tauri_app_lib"
crate-type = ["staticlib", "cdylib", "rlib"]

[build-dependencies]
tauri-build = { version = "2", features = [] }

[dependencies]
tauri = { version = "2", features = [] }
tauri-plugin-opener = "2"
serde = { version = "1", features = ["derive"] }
serde_json = "1"

2. 添加 thunk-rs

这里使用 thunk-rs 来集成 VC-LTL5 和 YY-Thunks。

进入 src-tauri

1
2
cd src-tauri
cargo add thunk-rs --build

默认情况下,thunk-rs 会启用 XP 相关 feature,因此需要手动修改 Cargo.toml

最终配置:

1
2
3
[build-dependencies]
tauri-build = { version = "2", features = [] }
thunk-rs = { version = "0.3.5", default-features = false, features =  ["win7", "lib", "subsystem_windows"] }

这里三个 feature 分别非常重要:

  1. win7:启用 Windows 7 对应的 YY-Thunks。
  2. lib:用于正确处理 Tauri 同时包含 library target 的情况。
  3. subsystem_windows:将最终 Windows 程序设置为 GUI subsystem,从而避免启动时出现额外的控制台窗口。

3. 修改 build.rs

Tauri 默认的:

1
2
3
fn main() {
    tauri_build::build()
}

修改为:

1
2
3
4
fn main() {
    thunk::thunk();
    tauri_build::build();
}

这样在编译过程中,thunk-rs 会自动将对应的 VC-LTL5 和 YY-Thunks 链接配置加入项目。

4. 构建

修改完成后:

1
pnpm tauri build

或者:

1
cargo build --release

成功时可以在构建输出中看到类似:

1
2
3
VC-LTL5 Enabled: 6.0.6000.0(x64)
YY-Thunks Enabled: Win7(x64)
Subsystem is set to WINDOWS

这说明已经进入最终链接过程。

5. 测试

为了避免 Edge WebView2 安装失败,这里手动安装好了 109 版本的 WebView2,下载地址:

dl.xrgzs.top/软件/Edge/109

Tip:Edge 安装包默认安装 Edge 到用户目录,但是也可以作为 Edge WebView2 安装包来使用,通过这种方法安装不会带自动更新程序(本身也停更了不需要):

1
MicrosoftEdge_X64_109.0.1518.78_Stable.exe --msedgewebview --verbose-logging --do-not-launch-msedge --system-level

src-tauri\target\release\bundle\nsis\tauri-app_0.1.0_x64-setup.exe 放入 Windows 7 机器安装。测试工作正常。

这个环境是打过补丁和安装了VC运行库的,那没打过补丁的 Windows 7 SP1 能用吗?实测也是可以的。下面是最小环境测试,整个系统仅安装了 Edge WebView2:

补充内容

为什么需要 YY-Thunks?

问题的核心并不是 Tauri 本身。现代 Rust 和现代 Windows 开发工具链可能会使用一些较新的 Windows API,而 Windows 7 并不存在这些 API。YY-Thunks 的作用就是在链接阶段提供兼容层,因此它可以让一些原本面向较新 Windows 的程序继续运行在 Windows 7 上。

【重要】为什么必须加 lib

这是整个过程中比较容易踩的坑。

如果不加的话,会出现下面这种情况,启动会带一个命令行窗口:

解决这个问题,加上 lib 是最终解决方案。

如果不加的话,会造成无法编译,因为 Tauri 项目并不是单纯生成一个 EXE,它同时包含:

1
2
tauri-app.exe
tauri_app_lib.dll

项目的 Cargo.toml 中有:

1
2
[lib]
crate-type = ["staticlib", "cdylib", "rlib"]

如果只配置:

1
features = ["win7", "subsystem_windows"]

在链接 tauri_app_lib.dll 时可能出现:

1
LNK2019: unresolved external symbol main

因为 subsystem_windows 会使链接器使用类似:

1
2
/SUBSYSTEM:WINDOWS
/ENTRY:mainCRTStartup

而 DLL 并不存在 main()

加入:

1
features = ["win7", "lib", "subsystem_windows"]

之后,thunk-rs 可以正确区分 library target,从而解决这个链接错误。

附:thunk-rs 的 features

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[features]
default = ["xp"]
lib = []
subsystem_windows = []
vc_ltl_only = []
vista = []
win10 = ["win10_10240"]
win10_10240 = []
win10_19041 = []
win7 = []
win8 = []
windows_vista = ["vista"]
windows_xp = ["xp"]
xp = []

需要注意:这不等于 Tauri 官方“无条件支持 Windows 7”

这里需要区分:“能够通过兼容层运行”和“官方当前版本完整支持 Windows 7”并不是完全相同的概念。正常情况下,Tauri v2是不支持Windows 7的。本文通过野路子实现在Windows7上运行,出现问题与官方无关。其次,Rust、第三方插件蹬都可能存在自己的最低系统要求。因此实际项目必须在Windows 7 SP1的真实环境或者虚拟机中测试。