在 Linux 上使用 Go 进行交叉编译 是非常简单的,Go 原生支持交叉编译,不需要额外工具链(除了某些特殊情况,如 CGO)。
交叉编译核心是两个环境变量:
GOOS:目标操作系统GOARCH:目标 CPU 架构GOOS=windows GOARCH=amd64 go build -o app.exe main.go
GOOS=darwin GOARCH=amd64 go build -o app-mac main.go
GOOS=linux GOARCH=arm GOARM=7 go build -o app-arm main.go
| 目标平台 | GOOS | GOARCH |
|---|---|---|
| Linux x86_64 | linux | amd64 |
| Linux ARM | linux | arm |
| Windows x86_64 | windows | amd64 |
| macOS Intel | darwin | amd64 |
| macOS Apple Silicon | darwin | arm64 |
查看所有支持平台:
go tool dist list
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
✅ 不需要 C 编译器
✅ 交叉编译最简单
交叉编译会失败:
CGO_ENABLED=1 时需要对应平台的交叉编译器
sudo apt install gcc-mingw-w64
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc go build
#!/bin/bash
platforms=(
"linux/amd64"
"linux/arm64"
"windows/amd64"
"darwin/amd64"
"darwin/arm64"
)
for p in "${platforms[@]}"; do
GOOS=${p%/*}
GOARCH=${p#*/}
echo "Building $GOOS/$GOARCH"
CGO_ENABLED=0 GOOS=$GOOS GOARCH=$GOARCH go build -o bin/app-$GOOS-$GOARCH
done
❌ Windows 下没加 .exe
✅ Linux 编译 Windows 必须:app.exe
❌ 使用了 os/user、net 等依赖系统调用
✅ 一般没问题,但注意行为差异
❌ 文件路径分隔符
✅ 使用 filepath.Join
✅ Linux 下交叉编译 Go:
CGO_ENABLED=0 GOOS=目标系统 GOARCH=目标架构 go build
如果你有 具体目标平台或是否使用 CGO,我可以给你精确命令。