Go语言环境信息及交叉编译小结

Go环境信息

在Golang中可以通过go env命令来查看当前的环境信息,如下图所示:

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

参考资料

本文标题:Go语言环境信息及交叉编译小结

本文链接:http://yedward.net/post/29.html

本文版权归作者所有,欢迎转载,转载请以文字链接的形式注明文章出处。

本博客不提供评论功能,有任何问题请发送邮件至:yedward92@qq.com

相关文章