golang官方文档的介绍, go编译器可以支持12种指令集. 本文编译是arm版本的golang. 

编译环境: 

Linux ubuntu 5.0.0-32-generic #34~18.04.2-Ubuntu SMP Thu Oct 10 10:36:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

目标环境:

Linux imx6ulevk 4.1.15imx6ul-GW-4.1.15-1.1.0+ #337 SMP PREEMPT Tue Sep 24 19:57:05 CST 2019 armv7l armv7l armv7l GNU/Linux

 

<一>: 前置

官方文档上这么介绍

Go 1.4 was the last distribution in which the toolchain was written in C.

Go 1.4是用C编写工具链的最后一个版本.

所以想编译go1.4以后的golang, 先编译此版本的工具链. 再用此工具链编译其后的版本.

所以要准备两个版本的源码, go1.4和你要编译的版本.

1, go1.4版source地址如下:

2, 编译版本的source, 我编译的是go1.14版, 也可选选择其他版本. go1.14地址如下:

 

<二>: 编译

1, 编译go1.4

    a) 解压go1.4在/usr/local下, 因为编译环境是x86_64, 所以先export下环境

export GOOS=linux
export GOARCH=amd64

    b) 编译

cd /usr/local/go/src

./make.bash

2, 编译go1.14

    a) 先配置下/etc/profile, 增加一项并export

GOROOT_BOOTSTRAP=/usr/local/go
export PATH=$PATH:$GOROOT_BOOTSTRAP:$GOROOT_BOOTSTRAP/bin

     保存后执行source /etc/profile使环境生效(可以执行go命令)

    b) 解压go1.14在$HOME下, 因为目标环境是arm, 所以先export下环境

export GOOS=linux
export GOARCH=arm
export GOARM=7
export CGO_ENABLED=1
export CC_FOR_TARGET=/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-gcc
export CXX_FOR_TARGET=/opt/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-g++

    我的目标环境是armv7, 配置GOARCH=arm, 配置GOARM=7

    使用cgo, 配置CGO_ENABLED=1

    其中CC_FOR_TARGET和CXX_FOR_TARGET两项是你的arm版的gcc和g++

    c) 编译

cd $HOME/go/src

./bootstrap.bash

编译好的arm版本的golang在$HOME/go-linux-amd64-bootstrap下

 

<三> 测试

把编译好的arm-golang放在自己的板子里, 并配置环境, 我的环境配置如下:

export GO111MODULE=on
export GOPROXY=https://goproxy.io
GOROOT=/usr/local/go
GOPATH=/home/root

以websocket为例, 使用的开源库是github.com/gorilla/websocket, 下载编译

go get "github.com/gorilla/websocket"

测试结果如下:

 

结束.