温馨提示×

ubuntu如何交叉编译golang

小樊
48
2026-10-16 01:44:23
栏目: 编程语言

在 Ubuntu 上交叉编译 Golang 程序,核心思路是:利用 Go 自带的交叉编译能力(CGO 关闭时最简单),或者配合交叉编译工具链(CGO 开启时)。

下面分情况说明。


一、最简单方式(不使用 CGO)

Go 原生支持交叉编译,不需要目标平台工具链。

1. 基本命令

# 例如编译到 Linux ARM64
GOOS=linux GOARCH=arm64 go build -o app-arm64

常见组合:

# Windows 64位
GOOS=windows GOARCH=amd64 go build

# macOS Intel
GOOS=darwin GOARCH=amd64 go build

# macOS Apple Silicon
GOOS=darwin GOARCH=arm64 go build

# Linux ARM (32位)
GOOS=linux GOARCH=arm go build

# Linux MIPS
GOOS=linux GOARCH=mips go build

2. 查看支持的平台

go tool dist list

二、使用 CGO 的交叉编译(需要工具链)

如果你的代码用了:

  • import "C"
  • SQLite(有些版本)
  • 某些硬件/系统库

就必须开启 CGO_ENABLED=1,此时需要目标平台交叉编译器。

示例:Ubuntu → ARM Linux

1. 安装交叉编译工具

sudo apt update
sudo apt install gcc-arm-linux-gnueabihf

2. 编译

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

常见工具链包名

目标平台 工具链
ARM32 gcc-arm-linux-gnueabihf
ARM64 gcc-aarch64-linux-gnu
MIPS gcc-mips-linux-gnu
RISC-V gcc-riscv64-linux-gnu

三、交叉编译常见坑

1. CGO 默认是关的

go env CGO_ENABLED

交叉编译时默认是 0,否则容易失败。

2. 静态编译(推荐)

go build -ldflags "-extldflags -static"

3. 指定 glibc 版本

目标系统太老时,可用 musl:

sudo apt install musl-tools
CGO_ENABLED=1 CC=musl-gcc go build

四、推荐工作流(实用)

✅ 不需要 C:

  • 直接 GOOS / GOARCH

✅ 需要 C:

  • Ubuntu 装交叉 gcc
  • CGO_ENABLED=1 CC=xxx-gcc

如果你能告诉我:

  • 目标平台(ARM?MIPS?Windows?)
  • 是否使用 CGO / SQLite / OpenCV

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

0 踩