【翻译】Go 1.1 交叉编译

原创
2013/07/14 21:07
阅读数 1.8K

这是一篇针对我在去年8月所写文章针对 Go 1.1 版本的更新补充介绍。自去年以来,像 goxc 这类 shell 封装工具已经诞生,从而为 Go 交叉编译和部署提供了一套完整的解决方案。

介绍

Go 对在外部机器上部署二进制文件而无需安装任何环境的支持非常好。这对于测试需要使用构建指令的包或者目标平台不适宜部署开发环境时是非常方便的。

对于构建与 Go 版本相匹配的交叉编译功能已经内置在了 Go 的构建脚本中;只要看看 GOOS、GOARCH,可能的话再看看 GOARM 就可以发现它们都在 ./make.bash 中被调用。因此,接下来的实现方案只是用于简化你的工作。

入门

1. 使用源码安装 Go。具体操作步骤可以在 golang.org/doc/install/source 找到。如果你已经非常熟悉安装过程,下面是一个简单的安装指示:

% 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 所支持的平台。

% 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 上的程序:

% 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 上使用。

一些警告

交叉编译二进制,而非 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

展开阅读全文
打赏
2
28 收藏
分享
加载中
无闻博主

引用来自“天崖追梦人”的评论

windows下如何实现交叉编译?

都是配置问题~ 我自己没交叉过
2013/07/22 12:38
回复
举报
windows下如何实现交叉编译?
2013/07/22 12:36
回复
举报
更多评论
打赏
2 评论
28 收藏
2
分享
返回顶部
顶部