golang交叉编译

原创
2016/04/18 19:37
阅读数 677

记录点分享http://gitos.org/2016/04/24/golang-cross-compiler/

一 环境安装

在苹果系统上安装golang环境非常简单, 用brew直接

brew install go

就可以安装好golang的开发环境.

如果没有安装brew, 则强烈建议安装. 实在不想的, 那么就下着mac版的golang, 在

~/.bash_profile

上加入

export GOROOT=/your go path
export GOPATH=/your develop go path

要交差编译, 必须要有对应平台的golang编译环境, 这里的环境不是指系统环境, 是指编译软件环境.

可以查看$GOROOT/pkg目录,

SZCMAC:pkg shizhengchu$ ll
total 0
drwxr-xr-x   9 shizhengchu  admin   306  4 18 14:22 .
drwxr-xr-x  16 shizhengchu  admin   544  4 12 08:13 ..
drwxr-xr-x   5 shizhengchu  admin   170  4 18 14:22 bootstrap
drwxr-xr-x  58 shizhengchu  admin  1972  4 18 15:32 darwin_amd64
drwxr-xr-x  57 shizhengchu  admin  1938  4 12 08:13 darwin_amd64_race
drwxr-xr-x   5 shizhengchu  admin   170  4 12 08:13 include
drwxr-xr-x  58 shizhengchu  admin  1972  4 18 14:23 linux_amd64
drwxr-xr-x   3 shizhengchu  admin   102  4 18 14:22 obj
drwxr-xr-x   4 shizhengchu  admin   136  4 18 14:23 tool

我的是mac系统, 默认情况下是没有linux_amd64这个目录的, (已经被我添加了编译环境),所以如果在苹果系统上想要编译出linux amd64上的程序, 必需要生成对应的编译环境.

二 生成linux amd64编译环境

交叉编译需要指定要目标的系统和cpu架构, 这里我的目标系统是linux系统, cpu是amd64指令集. 所以在golang环境中,配置环境变量GOARCH指定cpu架构, GOOS指定操作系统.

我们来查看一下当前golang的环境变量的配置:

SZCMAC:pkg shizhengchu$ go version
go version go1.6.1 darwin/amd64
SZCMAC:pkg shizhengchu$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/shizhengchu/Documents/devsrc/gospace"
GORACE=""
GOROOT="/usr/local/opt/go/libexec"
GOTOOLDIR="/usr/local/opt/go/libexec/pkg/tool/darwin_amd64"
GO15VENDOREXPERIMENT="1"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common"
CXX="clang++"
CGO_ENABLED="1"

 看出这是苹果系统上的环境变量, 要编译linux 上的需要设置

GOOS=linux GOARCH=amd64

我们进入到golang的源码目录, 生成linux编译环境

cd $GOROOT/src
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash --no-clean

但是出错了, 提示我们GOROOT_BOOTSTRAP没有设置. 这是为什么呢?

因为golang自1.4后, 就由golang来编译golang了, 不使用GCC来编译了.所以, 我们要copy一份golang的开发环境到其它目录, 我然指定这个目录为GOROOT_BOOTSTRAP, 使用GOROOT_BOOTSTRAP指定的目录来编译golang 的linux编译环境.

然后再执行make.bash

cd $GOROOT
cd ..
cp -R libexec /Users/shizhengchu/go
export GOROOT_BOOTSTRAP=/Users/shizhengchu/go
cd $GOROOT/src
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash —no-clean

现查看$GOROOT/pkg就可以看到linux_amd64了.

三 交叉编译

进入工程, 设置GOOS和GOARCH, 再进行编译

GOOS=linux GOARCH=amd64 go build -o moxie main.go

这样编译出来的二进制程序已经是linux amd64上的程序了.


因为我们的环境变量都是在shell是设置, 关闭shell后不会影响系统的环境变量.为了简便, 避免每次编译都要输入一长串, 可以建立一下make.linux_amd64文件, 写入

GOOS=linux GOARCH=amd64 go build -o moxie main.go

这样, 就可以sh make.linux_amd64来进行交叉编译.




展开阅读全文
打赏
1
8 收藏
分享
加载中
更多评论
打赏
0 评论
8 收藏
1
分享
返回顶部
顶部