Mac下进行golang的交叉编译

      因为golang的出身,对于linux的支持是最好的,相应来讲,Mac的支持也很不错,对windows的支持是最差的。linux

      进行交叉编译最好是从源码开始编译,并且在交叉编译中是不支持cgo的,这点请注意。golang

      1. 得到golang的源码windows

          这个固然是从官方网站下载了,只是golang是google推出的语言,因此须要翻个墙。我下载了1.4.2的golang的tar包,而后解压。虽然说只需配置正确,能够放到任意位置,但仍是推荐放到/usr/local目录下。请注意,这个时候尚未编译工具,不只交叉编译不行,本地编译都是不行的。bash

        设置GOROOT环境变量,PATH里面增长路径架构

      2. 编译本机的工具链工具

          cd $GOROOT\src网站

          ./make/bashui

          编译以后就能看到/usr/local/go目录下多了一个bin目录,里面存放了本地编译所须要的工具,这个时候本机编译就能够本机编译了。google

          对比下图咱们能够很清楚的看到变化。spa

      


      3. 构建跨平台的编译器和连接器

          咱们前面生成的工具链是针对本机的,也就是Mac下使用的,要支持交叉编译,显然须要支持其余平台的工具链,因此这一步就是用来构建这样的工具链。

          这一步是运行一个buildcmd的脚本文件,文件内容以下所示。其中,8x表示386的架构、6x表示amd64的架构、5x表示arm的架构。 

          运行这个文件后,会生成指定架构下的编译和连接工具。      

#!/bin/sh
set -e
for arch in 8 6 5; do
    for cmd in a c g l; do
        go tool dist install -v cmd/$arch$cmd
    done
done
exit 0
  

      4.构建目标版本的标准命令工具和库

          和本机同样,咱们须要交叉编译哪一个平台的内容,就须要编译出目标平台的工具链。咱们先看一下go env运行显示的一些环境参数。

          

          这里GOARCH和GOOS分布表明目标平台的架构和OS信息,GOHOSTARCH和GOHOSTOS表明宿主机的架构和OS信息。

          由于咱们是在Mac环境下,如今GOHOSTARCH就是amd64,GOHOSTOS就是darwin,这个是不变的;默认GOARCH和GOOS是本机平台,咱们要交叉编译,就是要把这两个参数改变以后,运用相关的工具链进行编译连接,生成可用的image。

           咱们在看一下/usr/local/go/bin目录,刚才咱们生成了这个目录,并把它加入了PATH环境变量。这个目录里面存放了编译工具,显然,目前只能编译本机。咱们要生成能编译目标平台的工具,因此咱们再次运行make.bash,不过须要指定GOARCH和GOOS,假定咱们须要编译32位windows下的软件,则命令以下:

           GOARCH=386 GOOS=windows ./make.bash

           若是有权限问题,请加上sudo

           这个时候咱们再看/usr/local/go/bin目录,是否是看见新增长了一个windows_386的目录?里面存放的就是咱们要的编译工具。

          

      5. 构建目标版本的标准库

          这一步是运行一个buildpkg的脚本文件,文件内容以下所示:

#!/bin/sh
if [ -z "$1" ]; then
    echo 'GOOS is not specified' 1>&2
    exit 2
else
    export GOOS=$1
    if [ "$GOOS" = "windows" ]; then
        export CGO_ENABLED=0
    fi
fi
shift
if [ -n "$1" ]; then
    export GOARCH=$1
fi
cd $GOROOT
go tool dist install -v ../pkg
go install -v -a std

          这个脚本用于传递使用这个脚本须要传入目标环境的OS和ARCH的参数,用于设置GOOS和GOARCH这两个参数,而后生成目标平台下连接的标准库。仍是以32为的windows作例子,命令为:

          ./buildpkg windows 386

          一样,若有权限问题,请用sudo

          运行结束后,咱们看一下/usr/local/go/pkg目录,是否是增长了windows_386的目录?里面存放了相应的库


      6. 交叉编译.go源文件

          前面的准备工做完成后,就能够正式编译源文件了。须要注意的是,咱们仍然须要指定GOOS和GOARCH这两个参数,若是不指定,会被认为编译本地文件,继续以32位windows为例,命令以下:

          CGO_ENABLED=0 GOOS=windows GOARCH=386 go build ./hello.go

          其中,CGO_ENABLED=0表示不使用cgo,GOOS=windows表示目标平台是windows,GOARCH=386表示32位系统,而后编译出的结果就是32位windows平台下运行的软件!