在 Linux 上配置 Golang 交叉编译(Cross Compilation) 其实非常简单,因为 Go 原生支持交叉编译,不需要额外安装交叉工具链(除非用到 CGO)。
下面按 常见需求 给你一个完整说明。
Go 通过两个环境变量控制目标平台:
GOOS:目标操作系统GOARCH:目标 CPU 架构常用组合示例:
| 平台 | GOOS | GOARCH |
|---|---|---|
| Linux amd64 | linux | amd64 |
| Linux arm64 | linux | arm64 |
| Windows 64位 | windows | amd64 |
| macOS Intel | darwin | amd64 |
| macOS M1/M2 | darwin | arm64 |
GOOS=windows GOARCH=amd64 go build -o app.exe main.go
GOOS=darwin GOARCH=arm64 go build -o app_darwin main.go
GOOS=linux GOARCH=arm64 go build -o app_arm64 main.go
✅ 不需要安装任何交叉编译器
go tool dist list
示例输出:
linux/amd64
linux/arm64
windows/amd64
darwin/arm64
如果你的项目 用到了 CGO(如 sqlite、opencv),情况不同。
CGO_ENABLED=1 GOOS=windows go build
# 会报错
sudo apt install gcc-mingw-w64
然后:
CGO_ENABLED=1 \
GOOS=windows \
GOARCH=amd64 \
CC=x86_64-w64-mingw32-gcc \
go build -o app.exe main.go
sudo apt install gcc-aarch64-linux-gnu
CGO_ENABLED=1 \
GOOS=linux \
GOARCH=arm64 \
CC=aarch64-linux-gnu-gcc \
go build -o app_arm64 main.go
#!/bin/bash
for target in \
"linux amd64" \
"linux arm64" \
"windows amd64" \
"darwin arm64"
do
os=$(echo $target | awk '{print $1}')
arch=$(echo $target | awk '{print $2}')
echo "Building $os/$arch"
GOOS=$os GOARCH=$arch go build -o bin/app_${os}_${arch} main.go
done
\filepath.Joingo build -ldflags "-s -w" -o app main.go
✅ 纯 Go 项目
GOOS / GOARCH⚠️ CGO 项目
CC如果你告诉我:
我可以给你 精确的一条命令。