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"
测试结果如下:
结束.