shlamp 2019-06-29
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标记的区别。