Go语言交叉编译(cgo)

4,971 阅读2分钟

Golang交叉编译

Go里面交叉编译分两种:

  • CGO编译:不支持交叉编译
  • 原生GO编译:支持交叉编译

原生GO编译出来的,自带跨平台。而第三方使用了CGO进行编译的,需要辅助编译器来帮我们实现交叉编译。

原生GO编译

在没有CGO调用的情况下,交叉编译只需要带上三个参数便可以实现

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build

  • CGO_ENABLED : 1=开启CGO 0=关闭CGO。默认为1
  • GOOS:平台系统
  • GOARCH:平台架构(32位、64位)

可选参数-ldflags是编译选项:

  • -s -w:去除调试信息。可以减少构建后文件体积
  • --extldflags "-static -fpic": 完成静态编译。编译生成的文件可以任意放在指定平台下运行,不需要运行环境配置

尽量选择静态编译。部分Linux上跑不起来,需要另外安装库

例如:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags '-s -w --extldflags "-static -fpic"' main.go

Windows平台下不含CGO编译:

执行命令行:

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags '-s -w --extldflags "-static -fpic"' main.go

执行GoLand命令行:

CGO_ENABLED=0;GOARCH=amd64;GOOS=windows;CGO_LDFLAGS="-static"

MacOS平台下不含CGO编译:

执行命令行:

CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags '-s -w --extldflags "-static -fpic"' main.go

执行GoLand命令行:

GOARCH=amd64;GOOS=darwin

Linux平台下不含CGO编译:

执行命令行:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 CGO_LDFLAGS="-static" go build  src/main.go

执行GoLand命令行:

CGO_ENABLED=0;GOARCH=amd64;GOOS=linux;CGO_LDFLAGS="-static"

CGO交叉编译

安装环境

在 MacOS 下编译 Linux 和 Windows 的可执行程序,需要使用 Homebrew 安装 C/C++ 交叉编译工具链:

brew install FiloSottile/musl-cross/musl-cross
brew install mingw-w64

Windows平台编译工具:mingw-w64
Linux平台编译工具:musl-cross

或者使用MacPorts安装 mingw-w64环境。时间很长

  1. 下载MacPorts并安装

www.macports.org/install.php

  1. 安装 mingw-w64
sudo port install mingw-w64

官网参考https://ports.macports.org/port/mingw-w64

编译Windows平台

执行命令行:

CGO_ENABLED=1  CC="x86_64-w64-mingw32-gcc" GOOS=windows GOARCH=amd64 CGO_LDFLAGS="-static" go build src/main.go

执行GoLand命令:

CGO_ENABLED=1;CC=x86_64-w64-mingw32-gcc;GOARCH=amd64;GOOS=windows;CGO_LDFLAGS="-static"

编译Linux平台

执行命令行:

CGO_ENABLED=1  CC="x86_64-linux-musl-gcc" GOOS=linux GOARCH=amd64 CGO_LDFLAGS="-static" go build src/main.go

执行GoLand命令:

CGO_ENABLED=1;CC=x86_64-linux-musl-gcc;GOARCH=amd64;GOOS=linux;CGO_LDFLAGS="-static"

编译MacOS平台

目前编译到MacOS平台下的,交叉编译工具没有。

项目需要使用Sqlite3数据库。驱动go-sqlite3使用CGO编译。

在Mac系统下,编译对应的两个平台。目前是可以打包对应平台下的包,记录一下sqlite3交叉编译