在 Debian 下使用 Golang 进行交叉编译 非常常见,Go 原生就支持交叉编译,不需要额外安装交叉工具链。下面按 常见场景 给你一个完整说明。
Go 的交叉编译主要依靠两个环境变量:
GOOS 目标操作系统
GOARCH 目标 CPU 架构
只要设置好这两个变量即可。
go env GOOS GOARCH
例如输出:
linux
amd64
GOOS=windows GOARCH=amd64 go build -o app.exe main.go
GOOS=linux GOARCH=arm64 go build -o app main.go
适用于:
GOOS=darwin GOARCH=amd64 go build -o app main.go
GOOS=darwin GOARCH=arm64 go build -o app main.go
✅ Go 1.16+ 已支持 Apple Silicon
GOOS=linux GOARCH=386 go build -o app main.go
GOOS=freebsd GOARCH=amd64 go build -o app main.go
#!/bin/bash
for GOOS in linux windows darwin; do
for GOARCH in amd64 arm64; do
echo "Building $GOOS/$GOARCH"
GOOS=$GOOS GOARCH=$GOARCH go build -o bin/app-$GOOS-$GOARCH main.go
done
done
Go 默认禁用 Cgo:
CGO_ENABLED=0
✅ 交叉编译最稳定
❌ 不能使用 C 库(如 sqlite、openssl)
如果你 必须 使用 Cgo:
CGO_ENABLED=1 \
GOOS=linux \
GOARCH=arm64 \
CC=aarch64-linux-gnu-gcc \
go build -o app main.go
需要先安装交叉编译器:
sudo apt install gcc-aarch64-linux-gnu
常见交叉编译器:
| 平台 | 包名 |
|---|---|
| arm64 | gcc-aarch64-linux-gnu |
| armhf | gcc-arm-linux-gnueabihf |
| mingw | gcc-mingw-w64 |
✅ 最佳实践
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64 \
go build -ldflags="-s -w" \
-o app main.go
-s -w:去除调试信息,减小体积CGO_ENABLED=0:避免平台依赖go tool dist list
示例输出:
linux/amd64
linux/arm64
darwin/amd64
darwin/arm64
windows/amd64
Alpine 使用 musl libc,Debian 使用 glibc
✅ 解决方案:
CGO_ENABLED=0 go build
或直接在 Alpine 编译
Debian 下 Golang 交叉编译只需要设置
GOOS + GOARCH,99% 情况下不需要额外工具。
如果你愿意,可以告诉我:
我可以给你一条 完全可复制的命令 ✅