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

相关推荐
数据知道1 小时前
Windows 安全基线:组策略、UAC、Defender 深度配置
windows·安全·网络安全
FellAveal2 小时前
【Go语言入门学习笔记】Part19.速率控制、原子计数器、互斥锁(Mutex)、状态协程
笔记·学习·golang
大模型码小白4 小时前
在 Windows 下 Codex 安装、配置与使用详细指南
java·人工智能·windows
小小龙学IT4 小时前
C++ Placement New 与显式析构:手动对象生命周期管理的艺术
c++·windows·mfc
luyun0202025 小时前
论坛里的小工具,吾爱出品
运维·服务器·windows
老王生涯6 小时前
rust开发环境配置-Windows & GNU
开发语言·windows·rust
nLif6 小时前
进程管道通讯-伪终端方式
c++·windows
CodexDave7 小时前
Python 自动化接单实战(九):Windows 免环境交付如何打包与诊断
windows·python·自动化·python自动化·pyinstaller·软件交付·windows打包
DB哥讲数据库8 小时前
【windows安装sql server教程】25步图文详解(附安装包)
windows
惠惠软件8 小时前
快速生成磁盘目录文件-双击运行a.bat ,可以看到磁盘目录下出现了 文件目录.txt-供大家学习研究参考
windows·学习·文件列表