在 Ubuntu 上交叉编译 Golang 程序,核心思路是:利用 Go 自带的交叉编译能力(CGO 关闭时最简单),或者配合交叉编译工具链(CGO 开启时)。
下面分情况说明。
Go 原生支持交叉编译,不需要目标平台工具链。
# 例如编译到 Linux ARM64
GOOS=linux GOARCH=arm64 go build -o app-arm64
常见组合:
# Windows 64位
GOOS=windows GOARCH=amd64 go build
# macOS Intel
GOOS=darwin GOARCH=amd64 go build
# macOS Apple Silicon
GOOS=darwin GOARCH=arm64 go build
# Linux ARM (32位)
GOOS=linux GOARCH=arm go build
# Linux MIPS
GOOS=linux GOARCH=mips go build
go tool dist list
如果你的代码用了:
import "C"就必须开启 CGO_ENABLED=1,此时需要目标平台交叉编译器。
sudo apt update
sudo apt install gcc-arm-linux-gnueabihf
CGO_ENABLED=1 \
GOOS=linux \
GOARCH=arm \
CC=arm-linux-gnueabihf-gcc \
go build -o app-arm
| 目标平台 | 工具链 |
|---|---|
| ARM32 | gcc-arm-linux-gnueabihf |
| ARM64 | gcc-aarch64-linux-gnu |
| MIPS | gcc-mips-linux-gnu |
| RISC-V | gcc-riscv64-linux-gnu |
go env CGO_ENABLED
交叉编译时默认是 0,否则容易失败。
go build -ldflags "-extldflags -static"
目标系统太老时,可用 musl:
sudo apt install musl-tools
CGO_ENABLED=1 CC=musl-gcc go build
✅ 不需要 C:
GOOS / GOARCH✅ 需要 C:
CGO_ENABLED=1 CC=xxx-gcc如果你能告诉我:
我可以给你一条精确命令。