温馨提示×

ubuntu golang交叉编译怎么弄

小樊
40
2026-10-13 03:50:46
栏目: 编程语言

在 Ubuntu 上用 Golang 做**交叉编译(cross compile)**其实非常简单,因为 Go 天生支持交叉编译,不需要额外安装交叉工具链(除非涉及 CGO)。

下面按常见场景给你说明。


一、纯 Go 程序(不使用 CGO)

这是最常见、最简单的情况。

基本命令格式

GOOS=目标系统 GOARCH=目标架构 go build

常见示例

1. 编译到 Windows(64 位)

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

2. 编译到 macOS(Intel)

GOOS=darwin GOARCH=amd64 go build -o app_darwin

3. 编译到 macOS(Apple Silicon)

GOOS=darwin GOARCH=arm64 go build -o app_darwin_arm64

4. 编译到 Linux ARM(树莓派等)

GOOS=linux GOARCH=arm GOARM=7 go build -o app_arm

5. 编译到 Linux ARM64

GOOS=linux GOARCH=arm64 go build -o app_arm64

二、查看支持的平台

go tool dist list

输出示例:

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

三、使用了 CGO 的情况(重点)

如果你的代码里用了:

  • import "C"
  • SQLite(某些库)
  • 一些底层 C 库

那就不能只用 GOOS / GOARCH,需要交叉 C 编译器。

示例:Ubuntu → 编译 Windows(CGO)

sudo apt install gcc-mingw-w64

CGO_ENABLED=1 \
GOOS=windows \
GOARCH=amd64 \
CC=x86_64-w64-mingw32-gcc \
go build -o app.exe

示例:Ubuntu → 编译 ARM Linux(CGO)

sudo apt install gcc-arm-linux-gnueabihf

CGO_ENABLED=1 \
GOOS=linux \
GOARCH=arm \
CC=arm-linux-gnueabihf-gcc \
go build -o app_arm

⚠️ 如果不需要 CGO,强烈建议:

CGO_ENABLED=0

这样交叉编译最省事。


四、一次性编译多个平台(脚本示例)

#!/bin/bash

platforms=(
  "windows/amd64"
  "linux/amd64"
  "linux/arm64"
  "darwin/amd64"
  "darwin/arm64"
)

for p in "${platforms[@]}"; do
  GOOS=${p%/*}
  GOARCH=${p#*/}
  echo "Building $GOOS/$GOARCH"
  GOOS=$GOOS GOARCH=$GOARCH go build -o bin/app_${GOOS}_${GOARCH}
done

五、常见坑

  1. 文件路径分隔符
    • Windows 用 \
  2. 可执行文件后缀
    • Windows 必须是 .exe
  3. 时间 / 区号
    • 交叉编译不影响,但运行时环境要注意
  4. sqlite / openssl
    • 基本都会触发 CGO

六、总结一句话

✅ 纯 Go:直接 GOOS=xxx GOARCH=xxx go build
✅ 用 CGO:装对应交叉编译器 + 指定 CC

如果你告诉我:

  • 目标系统(Windows / macOS / ARM)
  • 是否用了 CGO / SQLite

我可以给你精确的一条命令。

0 踩