Go跨平台编译的方法学习

forrestsun · · 16985 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

从第一天开始学习Golang就知道它有一个很让人心动的特性就是跨平台编译,但一直没有去使用。最近做了一个小东西需要用到这个特性,所以在网上进行了搜索。

首先找到是国内文章是利用下载Go的源码包,将对其进行编译安装,完成后Go/src下的make.bash生成跨平台的编译器,这样在每次用时需要指定GOOS及GOARCH来进行编译,如:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build //编译为linux 64位系统下的程序

如果需要编译windows 64 位下的程序则要再写一个命令:

CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build //编译为windows 64位系统下的程序

具体介绍请看: “Golang的跨平台编译程序”

这种方法针对一次性编译、测试、学习很有用,但对于需要对多平台编译一次性处理会有一些麻烦

  • 首先你需要针对每个你想要部署的平台在编译机上都要运行一次相应的 make.bash来生成所需要编译器

  • 每次都要执行相应的编译命令(这个有点牵强,因为通过shell也可以实现批处理)

  • 本机需要保留所有生成的编译器,如果其他人也需要这样的环境则需要再执行一次所需编译器的生成工作

  • 为了保持本机干净(呵呵)

好吧,除了第一个有点像是一个麻烦,其它的都不是问题,主要目的是引出第二种方法,那就是利用docker进行部署编译:

  • 首先你需要安装docker 

  • 下载go的跨平台编译版本,我用的是golang 1.4.2-cross

sudo docker pull golang:1.4.2cross
  • 进入后运行一下 go env确定一个编译环境

复制代码

GOARCH="amd64"GOBIN=""GOCHAR="6"GOEXE=""GOHOSTARCH="amd64"GOHOSTOS="linux"GOOS="linux"GOPATH="/go"GORACE=""GOROOT="/usr/src/go"GOTOOLDIR="/usr/src/go/pkg/tool/linux_amd64"CC="gcc"GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"CXX="g++"CGO_ENABLED="1"

复制代码

  • 进入root目录下的bin目录我们能看到所有可编译的平台,是不是很多:)

复制代码

root@55140be4a751:/usr/src/go/bin#

复制代码

  • 运行:docker run --rm -it -v "$PWD":/go/src/myapp -w /go/src/myapp golang:1.4.2-cross bash

  其中:"$PWD",是指将当前目录挂载为docker的数据卷

    第一个/go/src/myapp 表示为当前目录挂载至数据卷的名称

    第二个/go/src/myapp 表示为进行shell后直接进入的工作目录

  • 在启动的shell中运行:

docker run --rm -it -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.3-cross bash 
$ for GOOS in windows linux; do > for GOARCH in386 amd64; do > go build -v -o myapp-$GOOS-$GOARCH //注意这里的减号间没有空格 
> done > done

 

   这里的 GOOS后windows linux指的是编译为什么平台,用到那个则输入那个,运行后输入出相应的结果:

 main.go  myapp-linux-386  myapp-linux-amd64  myapp-windows-386  myapp-windows-amd64



有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:forrestsun

查看原文:Go跨平台编译的方法学习

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

16985 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传