内容简介:Go语言环境信息及交叉编译小结
Go环境信息
在Golang中可以通过 go env
命令来查看当前的环境信息,如下图所示:
常用的环境信息所表示的意思:
(1)CGO_ENABLED:指定cgo工具是否可用的标识
标准 go 命令可以自动的使用cgo工具对导入了代码包C的代码和源码文件进行处理,但是当环境变量CGO_ENABLED被设置为0时,标准go命令就不能处理导入了代码包C的代码和源码文件。需要注意,当存在交叉编译的情况时,cgo工具一定是不可用的,即CGO_ENABLED=0。
(2)GOARCH:程序构建环境的目标计算架构
默认情况下,与程序运行环境的目标计算架构一致,及与GOHOSTARCH一致。但如果显式设置GOARCH,就会被显式设置的值替换。
(3)GOBIN:存放可执行文件的目录绝对路径
GOBIN的值来自环境变量GOBIN的设置。
(4)GOCHAR:程序构建环境的目标计算架构的单字符标识
GOCHAR的值会根据GOARCH的值来设置,当GOARCH的值为386时,GOCHAR的值就是8;当GOARCH的值为amd64时,GOCHAR的值就是6;当GOARCH的值是arm时,GOCHAR的值就是5。
(5)GOEXE:可执行文件的后缀
GOEXE与各个操作系统下的可执行文件的默认后缀是一致的,跟GOOS存在联系,只有当GOOS是windows时,GOEXE才会是.exe,否则就是空字符串。
(6)GOHOSTARCH:程序运行环境的目标计算架构
通过情况下,GOHOSTARCH不需要显式设置。
(7)GOOS:程序构建环境的目标操作系统
默认情况下,与程序构建环境的目标操作系统一致,及与GOHOSTOS一致。
(8)GOHOSTOS:程序构建环境的目标操作系统
与GOHOSTARCH类似,GOHOSTOS的值在不同的操作系统下是固定不变的,也不需要显式设置。
(9)GOPATH:工作区目录的绝对路径
GOPATH需要显式设置,如果有多个工作区,那么多个工作区之间用分隔符分隔。在Windows环境下,分隔符是引号(;),其他Unix或 linux 环境下,分隔符是冒号(:)。注意,GOPATH的值不能与GOROOT相同。
(10)GORACE:用于数据竞争检测的相关选项
GORACE需要显式开启。数据竞争会发生在多个goroutine争相访问相同变量且至少有一个goroutine中的程序在对这个变量进行写操作的情况下。
(11)GOROOT:GO语言的安装目录的绝对路径
只有在GO语言的非默认安装情况下才需要显式设置,比如Windows情况下go的默认安装目录是c:\Go。
(12)GOTOOLDIR:GO工具目录的绝对路径
根据GOROOT、GOHOSTOS、GOHOSTARCH来设置,其值为$GOROOT/pkg/tool/$GOOS_$GOARCH。
Go交叉编译
交叉编译是指在当前系统下编译其他系统环境的发行包。以在Windows系统下编译linux_amd64系统环境发行包为例:
(1)先配置下交叉编译环境
在GOROOT的src目录下,新建一个build.bat文件,并复制以下内容:
set CGO_ENABLED=0 set GOROOT_BOOTSTRAP=D:\Go\ ::x86块 set GOARCH=386 set GOOS=windows call make.bat --no-clean set GOOS=linux call make.bat --no-clean set GOOS=freebsd call make.bat --no-clean set GOOS=darwin call make.bat --no-clean :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::x64块 set GOARCH=amd64 set GOOS=windows call make.bat --no-clean set GOOS=linux call make.bat --no-clean set GOOS=freebsd call make.bat --no-clean set GOOS=darwin call make.bat --no-clean :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: pause
然后运行build.bat,等待结束,改程序会编译其他平台编译go需要的库和编译文件。
(2)编译linux_amd64
准备好交叉编译环境以后,在命令行中运行:
set GOOS=linux set GOARCH=amd64 go build -o -x APPNAME main.go
除了以上的交叉编译方式以外,还可以利用 Docker 来实现跨平台编译。
Docker中编译Go
docker hub中讲解的比较详细了,可以 点击这里 去官方查看。这里直接转载其中的两部分:
(1)Compile your app inside the Docker container
There may be occasions where it is not appropriate to run your app inside a container. To compile, but not run your app inside the Docker instance, you can write something like:
$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.8 go build -v
This will add your current directory as a volume to the container, set the working directory to the volume, and run the command go build which will tell go to compile the project in the working directory and output the executable to myapp. Alternatively, if you have a Makefile, you can run the make command inside your container.
$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.8 make
(2)Cross-compile your app inside the Docker container
If you need to compile your application for a platform other than linux/amd64 (such as windows/386):
$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=windows -e GOARCH=386 golang:1.8 go build -v
Alternatively, you can build for multiple platforms at once:
$ docker run --rm -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.8 bash $ for GOOS in darwin linux; do > for GOARCH in 386 amd64; do > go build -v -o myapp-$GOOS-$GOARCH > done > done
参考资料
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。