温馨提示×

golang linux交叉编译咋做

小樊
49
2026-10-24 18:16:15
栏目: 编程语言

在 Linux 上用 Golang 做交叉编译其实很简单,Go 原生就支持交叉编译,不需要额外安装目标平台工具链(除了 CGO 相关情况)。


一、基本原理

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

  • GOOS:目标操作系统
  • GOARCH:目标 CPU 架构
GOOS=linux GOARCH=amd64 go build

二、常见交叉编译示例

1️⃣ Linux → Windows

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

2️⃣ Linux → macOS

GOOS=darwin GOARCH=arm64 go build -o app_mac

(M1/M2 用 arm64,Intel Mac 用 amd64)

3️⃣ Linux → Linux(不同架构)

GOOS=linux GOARCH=arm64 go build -o app_arm64

三、查看支持的平台

go tool dist list

示例输出:

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

四、CGO 情况(⚠️重点)

✅ 纯 Go 代码

完全没问题,直接交叉编译。

❌ 使用了 CGO(如 sqlite、某些底层库)

需要目标平台 C 编译器:

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

Linux 上常见交叉编译器:

  • Windows: mingw-w64
  • ARM Linux: gcc-aarch64-linux-gnu

一般建议:

CGO_ENABLED=0 go build

(如果代码允许)


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

#!/bin/bash
for os in linux windows darwin; do
  for arch in amd64 arm64; do
    GOOS=$os GOARCH=$arch go build -o bin/app_${os}_${arch}
  done
done

六、常见坑

  1. 文件路径分隔符(/ vs \)
  2. 系统调用差异
  3. 依赖 C 库时必须 CGO
  4. 时间/编码可能不同

如果你有具体目标平台(比如“Linux 编 Windows 64 位”或“x86 编 ARM”)或者用了 sqlite / ffmpeg,可以告诉我,我给你精确命令。

0 踩