34 --> OpenWRT 嵌入式mips环境的go 环境搭建、gin验证测试代码分享

笔者早期在嵌入式上、 http server的程序,实现静态网页相关功能,采用的第三方 goahead 组件,纯C语言实现,
编写应用还是比较麻烦的。
go语音被称作互联网时代的"C" 。简单和高效率,跨平台功能也非常强大,本次项目中再次需要搞嵌入式的WEB服务,
并且还需要提供接口API功能,把设备功能向第三方开放,就采用go 语言来承担此次研发语言。
在工作之余分享一下go语言相关的体会,首先我们需要一个嵌入式开放环境,本篇就作为 go 专栏的开篇文章吧。

第一步 安装 go1.4 编译环境

curl -# -O https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz
tar -zxvf go1.4-bootstrap-20171003.tar.gz 
GOOS=linux GOARCH=amd64 ./make.bash

第二步 配置环境变量

为了使编译出来的最新的go支持arm,支持cgo,CC_FOR_TARGET 和 CXX_FOR_TARGET这两个配置项也必须要配置

//配置 go1.4 工作模块
export GOROOT_BOOTSTRAP=/home/robot/golang/go1.4
//配置mips的gcc交叉编译工作目录
export CC_FOR_TARGET=/opt/ixecloud-toolchain-0.11-ramips-mt7621_gcc-7.5.0_musl.Linux-x86_64/toolchain-mipsel_24kc_gcc-7.5.0_musl/bin/mipsel-openwrt-linux-gcc
export CXX_FOR_TARGET=/opt/ixecloud-toolchain-0.11-ramips-mt7621_gcc-7.5.0_musl.Linux-x86_64/toolchain-mipsel_24kc_gcc-7.5.0_musl/bin/mipsel-openwrt-linux-g++
export STAGING_DIR=/home/robot/OpenWrt/mtk7621-19.07/staging_dir

第三步 安装 go1.11 版本

curl -# -O https://dl.google.com/go/go1.11.src.tar.gz
tar -zxvf go1.11.src.tar.gz 
cd go1.11/src

3.1 开启CGO mipsle 指令的编译

编译 g1.11 mips交叉编译环境和 linux-amd64 的环境(宿主机)

robot@ubuntu:~/golang/go1.11/src$ CGO_ENABLED=1 GOOS=linux GOARCH=mipsle GOMIPS=softfloat ./make.bash
Building Go cmd/dist using /home/robot/golang/go1.4.
Building Go toolchain1 using /home/robot/golang/go1.4.
Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.
Building Go toolchain2 using go_bootstrap and Go toolchain1.
Building Go toolchain3 using go_bootstrap and Go toolchain2.
Building packages and commands for host, linux/amd64.
Building packages and commands for target, linux/mipsle.
---
Installed Go for linux/mipsle in /home/robot/golang/go1.11
Installed commands in /home/robot/golang/go1.11/bin

3.2 编译结果查询

宿主机和mips编译结果

robot@ubuntu:~/golang/go1.11$ ls pkg/
bootstrap  include  linux_amd64  linux_mipsle  obj  tool
robot@ubuntu:~/golang/go1.11$ ls bin/
go  gofmt  linux_mipsle
robot@ubuntu:~/golang/go1.11$ ls bin/linux_mipsle/
go  gofmt

第四步 配置开发环境变量

4.1 配置开发环境goenv-setup.sh脚本

新建goenv-setup.sh 文件,把下面内容拷贝到 文件中。

export CC_FOR_TARGET=/opt/ixecloud-toolchain-0.11-ramips-mt7621_gcc-7.5.0_musl.Linux-x86_64/toolchain-mipsel_24kc_gcc-7.5.0_musl/bin/mipsel-openwrt-linux-gcc
export CXX_FOR_TARGET=/opt/ixecloud-toolchain-0.11-ramips-mt7621_gcc-7.5.0_musl.Linux-x86_64/toolchain-mipsel_24kc_gcc-7.5.0_musl/bin/mipsel-openwrt-linux-g++
export STAGING_DIR=/home/robot/OpenWrt/mtk7621-19.07/staging_dir

export GOROOT=/home/robot/golang/go1.11
export GOBIN=$GOROOT/bin
export GOPATH=/home/robot/golang/go-workspace    #开发环境的目录文档
export PATH=$PATH:$GOBIN:GOPATH/bin

4.2 source goenv-setup.sh 初始化go开发环境变量

robot@ubuntu:~/golang$ echo $PATH
/home/robot/bin:/home/robot/.local/bin:/home/robot/bin:/home/robot/.local/bin:/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

robot@ubuntu:~/golang$ source go-env.sh 
robot@ubuntu:~/golang$ echo $PATH
/home/robot/bin:/home/robot/.local/bin:/home/robot/bin:/home/robot/.local/bin:/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:
      /home/robot/golang/go1.11/bin:GOPATH/bin

我可以看到 go 环境变量已经添加到 PATH 中,采用这种方式好处是,编译宿主机搭建多种开发环境。

4.3 查看go 版本

robot@ubuntu:~/golang/go-workspace$ go version
go version go1.11 linux/amd64

第五步 编写测试例程并在目标机上验证

5.1 例程

package main

import "fmt"

func main() {
    fmt.Println("Hello world")
}

5.2 交叉编译go 代码

CGO_ENABLED=1 GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build hello.go

5.3 目标机上验证

笔者已经验证 交叉编译 结果,此处就不贴图。

总结说明

环境说明:

  • 宿主机 : ubuntu 16
  • 目标主机: mtk7621a , 操作系统 openWRT 19.07

各种平台编译方法列举: golang编译openwrt 程序

GOARCH 可以为 mips/mipsle 分别对应处理器的大小端
GOOS=linux GOARCH=mipsle GOMIPS=softfloat CGO_ENABLED=0 go build

golang编译路由器GL-AR750
GOOS=linux GOARCH=mips GOMIPS=softfloat CGO_ENABLED=0 go build -o xxx xxx.go

golang编译小米路由器R3G

GOOS=linux GOARCH=mipsle GOMIPS=softfloat  go build -o xxx xxx.go

golang编译小米路由器R2D

GOOS=linux GOARM=5 GOARCH=arm CGO_ENABLED=0 go build

golang编译Android

 GOOS=linux GOARCH=arm CGO_ENABLED=0   go build

golang编译Linux

 GOOS=linux GOARCH=amd64  go build

golang编译Windows

 GOOS=windows GOARCH=amd64 CGO_ENABLED=0  go build

golang编译Mac

 GOOS=darwin GOARCH=amd64 CGO_ENABLED=0  go build

缩减包体积

go build -ldflags “-s -w”
-s 的作用是去掉符号信息。去掉符号表,golang panic 时 stack trace 就看不到文件名及出错行号信息了。
-w 的作用是去掉 DWARF tables 调试信息。结果就是得到的程序就不能用 gdb 调试了。

参考链接:
https://rakyll.org/cross-compilation/
https://github.com/golang/go/wiki/Articles#cross-platform-development
https://blog.csdn.net/yyz_1987/article/details/86611750

上一篇:golang学习笔记: gin框架的ShouldBind绑定参数


下一篇:Gin微服务框架_golang web框架_完整示例Demo