本文详解在现代 go 版本(1.4+)下安全、可靠地实现跨平台编译(如 linux → windows)的完整方案,摒弃已失效的源码编译方式,推荐使用官方支持的 `goos`/`goarch` 环境变量组合,并强调禁用 cgo 的关键性。
Go 自 1.5 版本起已完全内置交叉编译支持,无需重新编译 Go 工具链(如运行 make.bash),更不应直接修改或构建 $GOROOT/src 下的源
码——这正是你遇到 use of internal package not allowed 错误的根本原因。该错误源于 Go 1.4 引入的 internal 包可见性规则:从 Go 1.4 开始,$GOROOT/src/cmd/ 等目录被禁止直接导入 $GOROOT/src/internal 或 cmd/pprof/internal/... 等内部路径,而旧教程中强制构建整个工具链的方式会触发此限制,导致编译失败。
✅ 正确做法是:利用 Go 原生交叉编译能力,配合环境变量与 CGO_ENABLED=0。以下是标准流程:
确认 Go 版本(建议 ≥ 1.16)
go version # 输出示例:go version go1.22.3 linux/amd64
设置目标平台环境变量并构建
例如编译为 Windows 64 位可执行文件(.exe):
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -o myapp.exe main.go
若需 32 位 Windows:
GOOS=windows GOARCH=386 CGO_ENABLED=0 go build -o myapp.exe main.go
关键说明:为什么 CGO_ENABLED=0 不可省略?
⚠️ 注意事项:
总结:现代 Go 的交叉编译是开箱即用、稳定可靠的。放弃过时的源码构建思路,专注掌握 GOOS/GOARCH/CGO_ENABLED 三要素的组合使用,即可高效产出跨平台二进制,这是 Go 工程实践中最推荐、最可持续的实践方式。