golang中跨平台交叉编译涉及两个重要的环境变量:GOOS 和 GOARCH,分别代表 Target Host OS 和 Target Host ARCH. 如果没有显式设置这些环境变量,我们通过go env可以看到go编译器眼中这两个环境变量的当前值
GOARCH="amd64" // 程序构建环境的目标计算架构
GOBIN="/data/server/go/bin" // 存放可执行文件的目录的绝对路径
GOEXE="" // 可执行文件的后缀
GOHOSTARCH="amd64" // 程序运行环境的目标计算架构
GOHOSTOS="linux" // 程序运行环境的目标操作系统
GOOS="linux" // 程序构建环境的目标操作系统
GOPATH="/data/code" // 工作区目录的绝对路径
GORACE="" // 用于数据竞争检测的相关选项
GOROOT="/data/server/go" // Go语言的安装目录的绝对路径
GOTOOLDIR="/data/server/go/pkg/tool/linux_amd64" // Go工具目录的绝对路径
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build410649157=/tmp/go-build"
CXX="g++"
CGO_ENABLED="1" // 指明cgo工具是否可用的标识
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
// linux 环境变量设置 /etc/profile
export GOROOT=/data/server/go
export GOPKG=$GOROOT/pkg/tool/linux_amd64
export GOARCH=amd64
export GOOS=linux
export GOPATH=/data/code
export GOBIN=$GOROOT/bin:$GOPATH/bin
export PATH=$PATH:$GOBIN:$GOPKG:$GOPATH/bin
如果想要跨平台编译go程序,只需在build的时候制定目标主机的os和arch,如下例子所示所示
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go // win x64
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o main main.go // win x64
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go // linux x64
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main main.go // linux x64
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build main.go // mac x64
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o main main.go // mac x64
其中二者可以设置如下参数:
$GOOS $GOARCH
darwin 386
darwin amd64
freebsd 386
freebsd amd64
linux 386
linux amd64
linux arm incomplete
windows 386 incomplete
如果想要编译其他平台的可执行脚本,秩序指定相应的os和arch即可。
go build命令的常用标记说明
-a 强行对所有涉及到的代码包(包含标准库中的代码包)进行重新构建,即使它们已经是最新的了。
-n 打印编译期间所用到的其它命令,但是并不真正执行它们。
-p n 指定编译过程中执行各任务的并行数量(确切地说应该是并发数量)。在默认情况下,该数量等于CPU的逻辑核数。但是在darwin/arm平台(即iPhone和iPad所用的平台)下,该数量默认是1。
-race 开启竞态条件的检测。不过此标记目前仅在linux/amd64、freebsd/amd64、darwin/amd64和windows/amd64平台下受到支持。
-v 打印出那些被编译的代码包的名字。
-work 打印出编译时生成的临时工作目录的路径,并在编译结束时保留它。在默认情况下,编译结束时会删除该目录。
-x 打印编译期间所用到的其它命令。注意它与-n标记的区别。