温馨提示×

ubuntu golang能交叉打包吗

小樊
39
2026-10-04 08:57:06
栏目: 编程语言

可以的。Ubuntu 下用 Go 做交叉编译(交叉打包)非常简单,而且是 Go 的强项之一。


一、Go 交叉编译基本原理

Go 自带交叉编译支持,不需要额外安装目标平台工具链(除非用到 cgo)。

通过设置两个环境变量即可:

  • GOOS:目标操作系统
  • GOARCH:目标 CPU 架构

二、常见示例(在 Ubuntu 上)

1️⃣ 编译到 Windows

GOOS=windows GOARCH=amd64 go build -o app.exe main.go

2️⃣ 编译到 macOS

GOOS=darwin GOARCH=amd64 go build -o app-mac main.go

(M1/M2 用 arm64)

GOOS=darwin GOARCH=arm64 go build -o app-mac-arm main.go

3️⃣ 编译到 Linux ARM(如树莓派)

GOOS=linux GOARCH=arm GOARM=7 go build -o app-arm main.go

4️⃣ 编译到 Linux ARM64

GOOS=linux GOARCH=arm64 go build -o app-arm64 main.go

三、查看支持的平台

go tool dist list

输出示例:

linux/amd64
linux/arm64
windows/amd64
darwin/arm64
...

四、注意事项(很重要)

✅ 不使用 CGO(推荐)

默认 Go 是静态编译,交叉编译无障碍。

查看是否使用 cgo:

go env CGO_ENABLED

关闭 cgo:

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

⚠️ 如果用了 CGO(比如 sqlite、某些库)

就不能纯交叉编译,需要:

  • 安装目标平台交叉编译器
  • 或在本机用 Docker 构建

例如:

sudo apt install gcc-arm-linux-gnueabihf
CGO_ENABLED=1 CC=arm-linux-gnueabihf-gcc \
GOOS=linux GOARCH=arm go build

五、用 Docker 做干净交叉打包(推荐)

FROM golang:1.22
WORKDIR /app
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o app

六、总结

✅ Ubuntu + Go 完全支持交叉打包
✅ 不用 cgo 时几乎零配置
✅ 一条命令跨平台
⚠️ 用 cgo 才需要额外工具链

如果你告诉我:

  • 目标系统 / 架构
  • 是否用了 cgo / sqlite

我可以给你 精确命令或 Docker 方案。

0 踩