跳到正文

为 Go 或 Rust 应用制作 Windows 安装程序(可在任意系统交叉编译)

为 Windows 交叉编译 Go 或 Rust 程序、嵌入图标、为 GUI 应用隐藏控制台窗口,并将单个 .exe(及附带资源)打包为带快捷方式和卸载程序的 Setup.exe。

更新于 2026年10月31日 · 阅读约 4 分钟

Go 和 Rust 都能在 Mac 或 Linux 机器上为 Windows 生成单个静态链接的 .exe,这正是它们在桌面工具领域受欢迎的重要原因。但用户仍然希望安装这个 .exe,而不是把它一直放在“下载”文件夹里。本指南介绍真正重要的构建参数,以及如何把二进制文件变成 Setup.exe,在测试之前完全不需要碰 Windows。

Go

通过环境变量指定目标平台进行交叉编译:

GOOS=windows GOARCH=amd64 go build -ldflags "-s -w" -o MyApp.exe .
  • -s -w 会去除符号表和调试信息,缩小二进制体积。
  • 对于 GUI 应用(Fyne、Wails、Walk、webview 等),在 -ldflags 中加入 -H windowsgui,这样就不会弹出控制台窗口:-ldflags "-s -w -H windowsgui"。
  • 32 位版本设置 GOARCH=386,Windows on ARM 设置 arm64。

图标和版本信息。 Go 没有内置嵌入 Windows 图标的方式。go-winres 可以根据一个简短的 JSON 描述和你的 .ico 生成 .syso 资源文件;把 .syso 放进包目录,go build 会自动识别。没有它,.exe 会显示通用图标,不过安装程序创建的快捷方式仍会使用你上传的图标。

Rust

在 Windows 上,默认目标即可:

cargo build --release

在 macOS 或 Linux 上,使用 GNU 工具链目标,安装 MinGW 后即可交叉编译:

rustup target add x86_64-pc-windows-gnu
cargo build --release --target x86_64-pc-windows-gnu

cargo-xwin 是另一种选择,它可以交叉编译到 MSVC 目标。

  • 对于 GUI 应用,在 main.rs 顶部加入 #![windows_subsystem = "windows"] 以隐藏控制台窗口。
  • 要嵌入图标和版本信息,在 build.rs 中使用 winres 或 embed-resource crate,并配合一个引用 app.ico 的 .rc 文件。
  • 在 release 配置中设置 opt-level = "z"、lto = true 和 strip = true,可以得到更小的二进制文件。

上传什么

单个 .exe: 直接上传到 ExeTup,无需打包成 zip。安装程序会把它安装到 Program Files(或按用户目录)下,并创建快捷方式和卸载程序。

.exe 加附带资源(配置模板、webview 应用的网页资源、data/ 文件夹):按程序运行时期望的目录结构把它们打成一个 zip 上传。也可以只上传 .exe,然后在“其他文件”步骤中添加额外文件;两种方式下这些文件都会放在程序旁边。

接着填写名称、版本、发布者,选择安装范围和架构,上传 .ico,然后开始构建。在 Windows 上测试结果;参见没有 Windows 电脑时的测试方案。

命令行工具

安装程序主要面向桌面应用,但命令行工具同样受益:固定的安装位置、卸载条目,以及供 IT 团队使用 /S 进行静默部署。两点注意事项:

  • 安装程序不会把目录加入 PATH。请告知用户安装目录,或者让工具在首次运行时提示自行添加。
  • 按用户安装会放在 %LOCALAPPDATA%\Programs\MyApp,用户无需管理员权限即可访问。

对于面向开发者的工具,winget 或 scoop 清单可能比安装程序更适合你的用户;它们可以指向同一个已签名的 .exe。

注意事项

  • 杀毒软件的启发式检测。 新鲜出炉、未签名、静态链接的 Go 和 Rust 二进制文件有时会触发启发式扫描。把程序安装到 Program Files 的安装程序略有帮助;代码签名则帮助很大。参见 SmartScreen 指南。
  • 无需运行时,无需前置依赖。 两种语言都把运行时链接进了二进制。安装程序原样分发该文件。
  • 更新。 版本号更高的新安装程序会就地替换文件。

常见问题

可以只上传 .exe 吗?

可以。单个 .exe 可以直接上传,安装程序仍会提供快捷方式、卸载程序以及 Windows 设置中的条目。

构建安装程序需要 Windows 吗?

不需要。在你自己的系统上构建二进制文件并上传,ExeTup 会在云端编译安装程序。只有测试结果时才需要 Windows。

为什么我的 Go GUI 应用会弹出一个黑色控制台窗口?

使用 -ldflags "-H windowsgui" 构建。Rust 则在 main.rs 中加入 #![windows_subsystem = "windows"]。

如何让 .exe 本身显示我的图标?

把它作为 Windows 资源嵌入:Go 用 go-winres,Rust 用 winres 或 embed-resource crate。在 ExeTup 中上传同一个 .ico,用于安装程序和快捷方式。

相关指南