在 Windows 上做 Go 跨平台编

在 Windows 上做 Go 跨平台编译,核心就是:装 Go → 设 GOOS/GOARCH → 禁用 CGO → go build,一条命令即可产出 Linux/macOS/Windows 二进制。下面从环境准备到常用命令、避坑、脚本化,一步到位。


一、环境准备(Windows)

1. 安装 Go
  • 下载:https://go.dev/dl/,选 Windows amd64 MSI(推荐 1.21+)。
  • 安装后,打开 PowerShellCMD 验证:
powershell 复制代码
go version
# 输出类似:go version go1.22.5 windows/amd64
  • 确保 GOROOTGOPATHPATH 已自动配置好。
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

五、关键注意事项(避坑)

  1. 禁用 CGO(必须)CGO_ENABLED=0,否则可能依赖系统库,Linux 下报 not found

  2. 代码跨平台兼容

    • 路径用 filepath.Join(),不要硬写 /\
    • 避免平台专属 syscall(如 Windows 的 CreateProcess)。
    • 日志、配置文件路径用相对路径或环境变量。
  3. 验证二进制

    • Linux:chmod +x myapp && ./myapp --help
    • macOS:./myapp-darwin-arm64 --help
    • Windows:双击 exe 或 myapp.exe --help
  4. 启用 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 .

六、常见 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 保证兼容性,代码做好路径和系统调用兼容即可。

相关推荐
进击的程序猿~15 小时前
Go Zero源码阅读1
后端·golang
caimouse1 天前
Windows Research Kernel (WRK) 内存管理器完整分析
windows
济*沧*海1 天前
BaseMapper的介绍
java·windows·tomcat
李燚1 天前
Go 项目怎么组织:DDD 4 层 vs MVC vs 脚本式
开发语言·golang·mvc·ddd·agent框架·eino
vortex51 天前
PowerShell Provider 机制详解:从文件系统到注册表的统一抽象
windows·powershell
小狮子&1 天前
ubuntu2604终端右键新建窗口
windows
Generalzy1 天前
从 Web 页面到桌面应用:用 Go + WebView 构建一个轻量级桌面框架
开发语言·前端·golang
shx_wei1 天前
从函数调用到进程替换:使用 execl、CMake 与 PowerShell 构建一个多可执行程序
linux·c语言·windows·c
奶油话梅糖1 天前
锐捷常用命令速查表
java·网络·windows
love530love1 天前
CodexPro + MCP + Cloudflare 配置详解:HTTP2、QUIC 与连接排障
ide·人工智能·windows·ai agent