Go 交叉编译

Golang 支持交叉编译,可以在一个平台上编译生成另一个平台的可执行程序。 默认情况下,Go的runtime环境变量CGO_ENABLED=1,即默认开始cgo,允许你在Go代码中调用C代码

如果标准库中是在CGO_ENABLED=1情况下编译的,那么编译出来的最终二进制文件可能是动态链接,所以建议设置 CGO_ENABLED=0以避免移植过程中出现的不必要问题。

一 Mac 下编译 Linux 和 Windows 64位可执行程序

export CGO_ENABLED=0 
export GOOS=linux 
export GOARCH=amd64 
go build .
export CGO_ENABLED=0 
export GOOS=windows 
export GOARCH=amd64 
go build .

二 Linux 下编译 Mac 和 Windows 64位可执行程序

export CGO_ENABLED=0 
export GOOS=darwin 
export GOARCH=amd64 
go build .
export CGO_ENABLED=0 
export GOOS=windows 
export GOARCH=amd64 
go build .

三 Windows 下编译 Mac 和 Linux 64位可执行程序

  SET CGO_ENABLED=0
  SET GOOS=darwin
  SET GOARCH=amd64
  go build .
  SET CGO_ENABLED=0
  SET GOOS=linux
  SET GOARCH=amd64
  go build .

其中

  • 由于go交叉编译时读取的是环境变量设置,因此mac和linux需要export,windows 需要set 设置环境变量,否则可能不生效
  • GOOS:目标平台的操作系统(darwin、freebsd、linux、windows)
  • GOARCH:目标平台的体系架构(386、amd64、arm)

由于交叉编译不支持 CGO 所以要想跨平台最好禁用它,否则需要安装CGO环境才行,会比较麻烦。

Go 条件编译

对于需要特定条件才将文件编译,比如只是windows的特定实现,可以有效的减小编译后程序的大小。 那么可以采用该文件顶部首行使用如下标记,进行条件编译。 例如:

//go:build doc
package xxx
// 如下为代码正文

此时编译的时候,可以加上 -tags="doc" 表示将带有//go:build doc标记的go文件编译到程序当中。

go build -tags="doc" .

若没有加入该标志,则该go文件不会被编译到程序当中。