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

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

内容简介: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

参考资料


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

查看所有标签

猜你喜欢:

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

perl进阶

perl进阶

Randal L.Schwartz、brian d.foy、Tom Phoenix / 韩雷 / 人民邮电出版社 / 2015-10-1 / 69

本书是Learning Perl一书的进阶。学完本书之后,您可以使用Perl语言的特性编写从简单脚本到大型程序在内的所有程序,正是Perl语言的这些特性使其成为通用的编程语言。本书为读者深入介绍了模块、复杂的数据结构以及面向对象编程等知识。 本书每章的篇幅都短小精悍,读者可以在一到两个小时内读完,每章末尾的练习有助于您巩固在本章所学的知识。如果您已掌握了Learning Perl中的内容并渴......一起来看看 《perl进阶》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换