在 Linux 下使用 Golang 进行交叉编译 其实非常简单,Go 原生支持交叉编译,不需要额外安装目标平台的工具链(除了某些特殊情况,比如 CGO)。
Go 通过两个环境变量控制目标平台:
GOOS:目标操作系统GOARCH:目标 CPU 架构GOOS=target-os GOARCH=target-arch go build -o outputname main.go
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=linux GOARCH=arm64 go build -o app-arm64 main.go
go tool dist list
输出示例:
linux/amd64
linux/arm64
windows/386
windows/amd64
darwin/arm64
...
交叉编译 完全没问题
需要目标平台的 C 编译器
例如编译 Windows:
CC=x86_64-w64-mingw32-gcc \
GOOS=windows GOARCH=amd64 \
CGO_ENABLED=1 go build -o app.exe main.go
关闭 CGO(最简单):
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o app.exe main.go
| 变量 | 说明 |
|---|---|
| GOOS | 目标系统(linux/windows/darwin) |
| GOARCH | 目标架构(amd64/arm/arm64) |
| GOARM | ARM 版本(6/7) |
| CGO_ENABLED | 是否启用 CGO |
| CC | C 编译器路径 |
#!/bin/bash
for os in linux windows darwin; do
for arch in amd64 arm64; do
echo "Building $os/$arch"
GOOS=$os GOARCH=$arch go build -o bin/app-$os-$arch main.go
done
done
如果你有 具体目标平台(比如 Android、MIPS、RISC-V)或 用了什么库(如 SQLite),可以告诉我,我可以给你更精确的命令。