在 Windows 上做 Go 跨平台编译,核心就是:装 Go → 设 GOOS/GOARCH → 禁用 CGO → go build,一条命令即可产出 Linux/macOS/Windows 二进制。下面从环境准备到常用命令、避坑、脚本化,一步到位。
一、环境准备(Windows)
1. 安装 Go
- 下载:https://go.dev/dl/,选 Windows amd64 MSI(推荐 1.21+)。
- 安装后,打开 PowerShell 或 CMD 验证:
powershell
go version
# 输出类似:go version go1.22.5 windows/amd64
- 确保
GOROOT、GOPATH、PATH已自动配置好。
2. 核心环境变量(必懂)
- CGO_ENABLED=0 :禁用 CGO,纯静态编译,无依赖,跨平台最稳(默认 1)。
- GOOS:目标系统(linux/darwin/windows)。
- GOARCH:目标架构(amd64/arm64/386)。
二、PowerShell 编译命令(最常用)
1. 编译 Linux(服务器主流)
powershell
# Linux amd64(x64 服务器)
$env:CGO_ENABLED="0"; $env:GOOS="linux"; $env:GOARCH="amd64"
go build -o dist/myapp-linux-amd64 .
# Linux arm64(树莓派4、ARM服务器)
$env:CGO_ENABLED="0"; $env:GOOS="linux"; $env:GOARCH="arm64"
go build -o dist/myapp-linux-arm64 .
2. 编译 macOS
powershell
# macOS Intel(amd64)
$env:CGO_ENABLED="0"; $env:GOOS="darwin"; $env:GOARCH="amd64"
go build -o dist/myapp-darwin-amd64 .
# macOS M1/M2/M3(arm64)
$env:CGO_ENABLED="0"; $env:GOOS="darwin"; $env:GOARCH="arm64"
go build -o dist/myapp-darwin-arm64 .
3. 编译 Windows(指定架构)
powershell
# Windows amd64(64位 exe)
$env:CGO_ENABLED="0"; $env:GOOS="windows"; $env:GOARCH="amd64"
go build -o dist/myapp-windows-amd64.exe .
# Windows 386(32位 exe)
$env:CGO_ENABLED="0"; $env:GOOS="windows"; $env:GOARCH="386"
go build -o dist/myapp-windows-386.exe .
三、CMD 编译命令(兼容旧终端)
cmd
:: Linux amd64
set CGO_ENABLED=0
set GOOS=linux
set GOARCH=amd64
go build -o dist/myapp-linux-amd64 .
:: macOS arm64
set CGO_ENABLED=0
set GOOS=darwin
set GOARCH=arm64
go build -o dist/myapp-darwin-arm64 .
四、一键多平台编译脚本(build-all.ps1)
在项目根目录新建 build-all.ps1:
powershell
# 创建输出目录
New-Item -ItemType Directory -Force -Path dist
# 定义目标平台列表
$targets = @(
@{OS="linux"; ARCH="amd64"; OUT="myapp-linux-amd64"},
@{OS="linux"; ARCH="arm64"; OUT="myapp-linux-arm64"},
@{OS="darwin"; ARCH="amd64"; OUT="myapp-darwin-amd64"},
@{OS="darwin"; ARCH="arm64"; OUT="myapp-darwin-arm64"},
@{OS="windows"; ARCH="amd64"; OUT="myapp-windows-amd64.exe"}
)
# 循环编译
foreach ($t in $targets) {
$env:CGO_ENABLED="0"
$env:GOOS=$t.OS
$env:GOARCH=$t.ARCH
Write-Host "正在编译:$($t.OS)/$($t.ARCH) → dist/$($t.OUT)"
go build -o "dist/$($t.OUT)" .
}
Write-Host "`n✅ 全部编译完成,输出目录:./dist"
运行:
powershell
.\build-all.ps1
产出:
dist/
├── myapp-linux-amd64
├── myapp-linux-arm64
├── myapp-darwin-amd64
├── myapp-darwin-arm64
└── myapp-windows-amd64.exe
五、关键注意事项(避坑)
-
禁用 CGO(必须) :
CGO_ENABLED=0,否则可能依赖系统库,Linux 下报not found。 -
代码跨平台兼容 :
- 路径用
filepath.Join(),不要硬写/或\。 - 避免平台专属 syscall(如 Windows 的
CreateProcess)。 - 日志、配置文件路径用相对路径或环境变量。
- 路径用
-
验证二进制 :
- Linux:
chmod +x myapp && ./myapp --help - macOS:
./myapp-darwin-arm64 --help - Windows:双击 exe 或
myapp.exe --help
- Linux:
-
启用 CGO 的情况(慎用) :
- 需调用 C 代码时,必须安装目标平台交叉工具链(如
aarch64-linux-musl-gcc)。 - 命令示例:
powershell$env:CGO_ENABLED="1"; $env:GOOS="linux"; $env:GOARCH="amd64"; $env:CC="x86_64-linux-musl-gcc" go build -o myapp-linux . - 需调用 C 代码时,必须安装目标平台交叉工具链(如
六、常见 GOOS/GOARCH 组合
| 目标平台 | GOOS | GOARCH |
|---|---|---|
| Linux 64位 | linux | amd64 |
| Linux ARM64 | linux | arm64 |
| macOS Intel | darwin | amd64 |
| macOS M1/M2 | darwin | arm64 |
| Windows 64位 | windows | amd64 |
| Windows 32位 | windows | 386 |
七、总结
Windows 下 Go 跨平台编译极简:一套代码 + 三条环境变量 + go build 。优先用 PowerShell 脚本一键产出多平台二进制,禁用 CGO 保证兼容性,代码做好路径和系统调用兼容即可。