温馨提示×

linux golang如何交叉编译

小樊
47
2026-10-12 23:02:40
栏目: 编程语言

在 Linux 上使用 Go 进行交叉编译 是非常简单的,Go 原生支持交叉编译,不需要额外工具链(除了某些特殊情况,如 CGO)。


一、基本交叉编译方法

交叉编译核心是两个环境变量:

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

示例:在 Linux 上编译 Windows 程序

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

示例:编译 macOS 程序

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

示例:编译 ARM Linux(如树莓派)

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

二、常见 GOOS / GOARCH 组合

目标平台 GOOS GOARCH
Linux x86_64 linux amd64
Linux ARM linux arm
Windows x86_64 windows amd64
macOS Intel darwin amd64
macOS Apple Silicon darwin arm64

查看所有支持平台:

go tool dist list

三、是否支持 CGO(重要)

1️⃣ 纯 Go 代码(推荐)

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

✅ 不需要 C 编译器
✅ 交叉编译最简单


2️⃣ 使用了 CGO(如 sqlite、opencv)

交叉编译会失败:

CGO_ENABLED=1 时需要对应平台的交叉编译器

解决方法(举例:Linux → Windows)

sudo apt install gcc-mingw-w64
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 CC=x86_64-w64-mingw32-gcc go build

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

#!/bin/bash

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

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

五、常见坑

❌ Windows 下没加 .exe
✅ Linux 编译 Windows 必须:app.exe

❌ 使用了 os/user、net 等依赖系统调用
✅ 一般没问题,但注意行为差异

❌ 文件路径分隔符
✅ 使用 filepath.Join


六、总结

✅ Linux 下交叉编译 Go:

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

如果你有 具体目标平台或是否使用 CGO,我可以给你精确命令。

0 踩