go语言通过 GOOS 和 GOARCH 环境变量实现跨平台编译,支持 windows、linux、macOS 等多平台目标,结合 CGO_ENABLED= 0 可避免 C 依赖问题,并可通过脚本 自动化 构建多平台二进制文件。

在 golang 中搭建跨平台编译环境非常简单,得益于 Go 语言 原生支持交叉编译的特性,你无需额外 工具 链即可从一个平台编译出适用于其他 操作系统 和架构 的可执行文件。下面介绍如何配置和使用 Go 进行跨平台编译。
理解 GOOS 和 GOARCH
Go 通过环境变量 GOOS 和GOARCH控制目标平台的 操作系统 和处理器 架构。
常用组合包括:
- GOOS=windows, GOARCH=amd64 → 编译 Windows 64 位程序
- GOOS=darwin, GOARCH=arm64 → 编译macOS apple Silicon 版本
- GOOS=linux, GOARCH=386 → 编译 Linux 32 位程序
- GOOS=linux, GOARCH=arm, GOARM=7 → 编译 ARMv7 Linux 程序
你可以通过以下命令查看当前平台支持的所有选项:
立即学习“go 语言免费学习笔记(深入)”;
go tool dist list
设置环境变量并编译
在编译前设置目标平台的 GOOS 和 GOARCH。以 macos 为例,编译 Windows 和 Linux 版本:
# 编译 Windows 64 位可执行文件
GOOS=windows GOARCH=amd64 go build -o myapp.exe main.go
# 编译 Linux ARM64 版本
GOOS=linux GOARCH=arm64 go build -o myapp-linux-arm64 main.go
# 编译 macOS Intel 版本(从 Apple Silicon Mac 上)
GOOS=darwin GOARCH=amd64 go build -o myapp-darwin-amd64 main.go
Windows 用户可在 CMD 或 PowerShell 中使用 set 命令:
set GOOS=linux&&set GOARCH=amd64&&go build -o myapp main.go
避免 CGO 带来的限制
默认情况下,Go 的交叉编译不依赖外部 C 库,因此能顺利工作。但如果你的项目使用了 CGO(例如调用 C 代码),交叉编译会失败,因为需要对应平台的 C 编译器。
解决方案是禁用 CGO:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o myapp main.go
许多标准库功能(如 net)在 CGO 禁用时仍可用,但 DNS 解析等行为可能略有不同。建议在纯 Go 模式下开发以保持可移植性。
自动化多平台构建
可以编写脚本一次性生成多个平台的二进制文件:
#!/bin/bash
for os in windows linux darwin; do
for arch in amd64 arm64; do
echo “Building for $os/$arch”
GOOS=$os GOARCH=$arch CGO_ENABLED=0
go build -o bin/myapp-$os-$arch main.go
done
done
将上述脚本保存为 build.sh 并运行,即可生成多个平台的可执行文件。
基本上就这些。Go 的跨平台编译机制简洁高效,只要注意 CGO 问题,就能轻松为各种环境打包应用。不需要复杂的配置或第三方工具,开箱即用。