这是一篇针对我在去年8月所写文章针对 Go 1.1 版本的更新补充介绍。自去年以来,像 goxc 这类 shell 封装工具已经诞生,从而为 Go 交叉编译和部署提供了一套完整的解决方案。 linux
Go 对在外部机器上部署二进制文件而无需安装任何环境的支持很是好。这对于测试须要使用构建指令的包或者目标平台不适宜部署开发环境时是很是方便的。 git
对于构建与 Go 版本相匹配的交叉编译功能已经内置在了 Go 的构建脚本中;只要看看 GOOS、GOARCH,可能的话再看看 GOARM 就能够发现它们都在 ./make.bash 中被调用。所以,接下来的实现方案只是用于简化你的工做。 github
1. 使用源码安装 Go。具体操做步骤能够在 golang.org/doc/install/source 找到。若是你已经很是熟悉安装过程,下面是一个简单的安装指示: golang
% hg clone https://code.google.com/p/go % cd go/src % ./all.bash2. 从 Github 上检出用于支持交叉编译的脚本: github.com/davecheney/golang-crosscompile。
% git clone git://github.com/davecheney/golang-crosscompile.git % source golang-crosscompile/crosscompile.bash
3. 编译全部 Go 所支持的平台。 shell
% go-crosscompile-build-all go-crosscompile-build darwin/386 go-crosscompile-build darwin/amd64 go-crosscompile-build freebsd/386 go-crosscompile-build freebsd/amd64 go-crosscompile-build linux/386 go-crosscompile-build linux/amd64 go-crosscompile-build linux/arm go-crosscompile-build windows/386 go-crosscompile-build windows/amd64这将会编译每一个平台的 Go runtime 和标准库,你能够在 go/pkg 目录下看到下列包:
% ls -1 go/pkg darwin_386 darwin_amd64 freebsd_386 freebsd_amd64 linux_386 linux_amd64 linux_arm obj tool windows_386 windows_amd64
源文件 crosscompile.bash 中提供了针对各个平台的 go-$GOOS-$GOARC 函数,你能够将它做为你的标准 Go tool。例如,编译一个运行在 linux/arm 上的程序: windows
% cd $GOPATH/github.com/davecheney/gmx/gmxc % go-linux-arm build % file ./gmxc ./gmxc: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, not stripped
这个文件没法在宿主系统(如 darwin/amd64)上运行,但能够在 linux/arm 上使用。 bash
这篇文章讲述了如何构建目标环境上的 Go 程序,而不是构建目标环境上 Go 的开发环境。若是你想要构建 Go 开发环境,须要直接在相应环境下安装。对于大多数平台而言,你须要从源码安装,或者使用 Go 官方提供的安装包,若是你乐意使用的话。 函数
目前没法在开启 cgo 编译模式的状况下进行交叉编译,这是由于 cgo 涉及到的相关函数直接依赖于构建程序所在的操做系统。并且因为各个平台默认的 C 编译器不尽相同,所编译出的程序可能没法兼容。 工具
在 Go 1.1 中使用交叉编译时,CGO_ENBALED 会被设置为默认值 0(关闭)。 测试
由于一些 arm 平台的硬件缺失浮点单位,GOARM 的值是用于告知连接器是使用硬件仍是软件浮点代码。根据不一样平台的须要,你可能会在构建程序时修改下列环境变量:
% GOARM=5 go-linux-arm build
从版本 e4b20018f797 起,你将会可能很是友好的错误提示来告知你须要将 GOARM 设置为什么值。
$ ./gmxc runtime: this CPU has no floating point hardware, so it cannot run this GOARM=7 binary. Recompile using GOARM=5.
若是你不对 GOARM 进行设置,则默认使用硬件浮点单位。你能够阅读更多有关 Go 在 linux/arm 上的相关文章: Go Language Community Wiki 。
原文地址: http://dave.cheney.net/2013/07/09/an-introduction-to-cross-compilation-with-go-1-1