【翻译】Go 1.1 交叉编译

这是一篇针对我在去年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.bash
2. 从 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 开发环境,须要直接在相应环境下安装。对于大多数平台而言,你须要从源码安装,或者使用 Go 官方提供的安装包,若是你乐意使用的话。 函数

不支持 cgo 的交叉编译

目前没法在开启 cgo 编译模式的状况下进行交叉编译,这是由于 cgo 涉及到的相关函数直接依赖于构建程序所在的操做系统。并且因为各个平台默认的 C 编译器不尽相同,所编译出的程序可能没法兼容。 工具

在 Go 1.1 中使用交叉编译时,CGO_ENBALED 会被设置为默认值 0(关闭)。 测试

目标平台为 linux/arm 时须要设置 GOARM

由于一些 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

相关文章
相关标签/搜索