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

栏目: Go · 发布时间: 7年前

内容简介:Go语言环境信息及交叉编译小结

Go环境信息

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

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

常用的环境信息所表示的意思:

(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

参考资料


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java RESTful Web Service实战

Java RESTful Web Service实战

韩陆 / 机械工业出版社 / 2014-10-1 / 69.00

国内首本完整、深度地讲解如何基于Java标准规范实现REST风格的Web服务的专著,阿里巴巴Java技术专家12年开发经验结晶,3位业内著名技术专家联袂推荐!不仅深刻解读了最新的JAX-RS标准和其API设计,以及Jersey的使用要点和实现原理,而且系统讲解了REST的基本理论,更重要的是从实践角度深度讲解了如何基于Jersey实现完整的、安全的、高性能的REST式的Web服务。 《Jav......一起来看看 《Java RESTful Web Service实战》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器