为 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-resourcecrate,并配合一个引用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,用于安装程序和快捷方式。
相关指南
- 在 Mac 或 Linux 上制作 Windows 安装程序在 macOS 或 Linux 上开发时生成 Setup.exe 的各种方案,从交叉编译 NSIS 到纯浏览器构建,以及如何在没有 Windows 电脑的情况下测试结果。
- 将 .exe 转换为 Windows 安装程序(exe 转 Setup.exe)如何把一个普通的 .exe,或者包含 .exe 的文件夹,转换为带快捷方式和卸载程序的真正 Windows 安装程序,无需编写安装脚本。
- Setup.exe 静默安装:/S 参数、自定义目录与批量部署如何用 /S 静默运行基于 NSIS 的 Setup.exe,用 /D= 指定安装目录,静默卸载,并通过 Intune、PDQ 或脚本批量部署安装程序。