温馨提示×

ubuntu golang能否交叉打包

小樊
38
2026-10-19 00:29:23
栏目: 编程语言

可以的。Ubuntu 下使用 Go 语言完全支持交叉编译(交叉打包),而且 Go 原生就支持,不需要额外安装交叉编译工具链。


一、Go 交叉编译原理

Go 通过两个环境变量控制目标平台:

  • GOOS:目标操作系统(如 linux、windows、darwin)
  • GOARCH:目标架构(如 amd64、arm64、386)

只要设置好这两个变量,再执行 go build 即可。


二、在 Ubuntu 上交叉编译示例

1️⃣ 编译 Windows 程序(64 位)

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

2️⃣ 编译 macOS 程序(Intel)

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

3️⃣ 编译 macOS(Apple Silicon)

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

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

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

三、查看支持的平台

go tool dist list

常见输出示例:

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

四、注意事项(很关键)

⚠️ 1. CGO 问题(最常见坑)

如果代码里用了 CGO(比如 sqlite、某些加密库):

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

✅ 交叉编译推荐关闭 CGO

否则你需要:

  • 安装目标平台的交叉 C 编译器(非常麻烦)

⚠️ 2. 架构相关代码

  • 不要写死 int 长度
  • 注意字节序(endian)
  • 文件路径分隔符使用 filepath.Join

⚠️ 3. 依赖外部库

  • 纯 Go 依赖:✅ 无压力
  • 含 C 代码依赖:❌ 需额外处理

五、一键多平台打包脚本示例

#!/bin/bash
for os in linux windows darwin; do
  for arch in amd64 arm64; do
    GOOS=$os GOARCH=$arch CGO_ENABLED=0 go build -o build/app-$os-$arch
  done
done

六、总结

✅ Ubuntu + Golang
✅ 原生支持交叉编译
✅ 不需要交叉工具链(纯 Go)
✅ 实战中建议 CGO_ENABLED=0

如果你是:

  • 打 Docker 镜像
  • 给 树莓派 / 服务器
  • 做 CI 自动发布

我也可以给你具体方案。

0 踩