go交叉编译生成跨平台应用
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文件不会被编译到程序当中。