在 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+)。
  • 安装后,打开 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

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

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

相关推荐
goehou7 小时前
让 AI 替我操作这台电脑,先把手能伸多远定下来
windows·自动化·权限管理·ai agent
公子小六8 小时前
基于.NET的Windows窗体编程之WinForms数据持久化(1)
windows·microsoft·c#·.net·winforms
2601_967987371 天前
安装 Redis 或 Redis Stack
linux·windows·redis·macos·安装
xbzb1 天前
自定义 yum 软件源:Linux 上 createrepo,Windows 上纯 Python 也能造
linux·运维·windows·python·yum·createrepo
武雄(小星Ai)1 天前
Ollama报llama-server binary not found排坑实录:服务活着引擎没了
人工智能·windows·大模型·ollama·排坑
利威尔xu1 天前
Go map 底层崩溃:3 个 goroutine 并发写同一张 map,fatal error 崩掉整个服务
golang·源码·map·并发·后端开发
叼烟扛炮2 天前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain
Thneonl2 天前
桌宠穿透不是一行 SetWindowLong
windows·程序员
利威尔xu2 天前
2026-11-08-Go-defer-panic-recover面试
面试·golang
艺杯羹3 天前
Windows原生软件锁设计:从暴力杀进程丢数据到零轮询事件驱动架构
windows·系统架构·开源·开源软件·内存管理·开源协议