开发环境介绍

  • 主机操作系统:Ubuntu14.04 64位
  • 目标平台:IMX.6Q ARM Cortex-A9内核
  • 交叉工具链:arm-poky-linux-gnueabi,gcc4.9.1
  • Go版本:go1.13
  • 编译时间:2019.10.26

主机系统安装Go1.4

先下载go1.4的源码。因为go1.4版本之后的go语言版本编译器都是使用go语言编写的,使用go语言编译go,go1.4是最后一个使用gcc来编译的版本。所以为了从源代码编译Go需要先编译一个1.4版本的Go版本。

下载go1.4-bootstrap链接:mirrors.nju.edu.cn/golang/go1.4-bootstrap-20171003.tar.gz

下载完成之后将得到一个go1.4-bootstrap-20171003.tar.gz压缩包,接下来进行解压编译安装:

xxx@ubuntu:~$ export GO_INSTALL_PATH=/usr/local
xxx@ubuntu:~$ sudo tar -zxvf go1.4-bootstrap-20171003.tar.gz -C $GO_INSTALL_PATH
xxx@ubuntu:~$ cd $GO_INSTALL_PATH/go/src
xxx@ubuntu:/usr/local/go/src$ sudo GOOS=linux GOARCH=amd64 ./make.bash

编译之后将会在$GO_INSTALL_PATH/go/bin目录下生成go命令二进制文件。查看go的版本

xxx@ubuntu:~$ $GO_INSTALL_PATH/go/bin/go version
go version go1.14 linux/amd64

编译目标平台Go(ARM)

完成Go1.4的编译之后,可以利用Go1.4来编译新版本的Go,这里提供Go源代码下载地址

下载地址:mirrors.nju.edu.cn/golang/go1.13rc2.src.tar.gz   

解压源码:

# 设置编译目录
xxx@ubuntu:~$ export GO_BUILD=~/go_build
# 创建编译目录
xxx@ubuntu:~$ mkdir $GO_BUILD
# 解压源码到编译目录
xxx@ubuntu:~$ tar -xvf go1.13rc2.src.tar.gz  -C $GO_BUILD
# 进入源码目录
xxx@ubuntu:~$ cd $GO_BUILD/go/src

设置环境变量

编译相关环境变量说明:

参数 说明
GOROOT_FINAL go语言根目录(可不设置)
GOHOSTARCH 主机编译器系统架构
GOARCH 主机系统架构
GOOS 主机操作系统
GO_GCFLAGS 构建软件包和命令时go工具编译参数
GO_LDFLAGS 构建命令时go工具编译参数
CC 主机C编译器
CC_FOR_TARGET 目标系统C编译器
CXX_FOR_TARGET 目标系统C++编译器
PKG_CONFIG pkg-config工具的路径
GOROOT_BOOTSTRAP 安装目录
GOARM 使用的浮点运算协处理器版本号,只对arm平台有用,可选值有5,6,7

GOOS     GOARCH的可设置值:

GOOS GOARCH
darwin 386
darwin amd64
dragonfly 386
dragonfly amd64
freebsd 386
freebsd amd64
freebsd arm
linux 386
linux amd64
inux arm
netbsd 386
netbsd amd64
netbsd arm
openbsd 386
openbsd amd64
plan9 386
plan9 amd64
solaris amd64
windows 386
windows amd64

在$GO_BUILD/go/src创建arm_gcc.sh和arm_g++.sh文件:

hegaozhi@ubuntu:~/go_build/go/src$ cd $GO_BUILD/go/src
# 创建文件
hegaozhi@ubuntu:~/go_build/go/src$ touch arm_gcc.sh arm_g++.sh

在  arm_gcc.sh文件中写入对应C交叉编译器信息:

#!/bin/shexec /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi "$@"

在  arm_g++.sh文件中写入对应C++交叉编译器信息:

#!/bin/shexec /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++ -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi "$@"

在终端中输入以下内容设置环境变量:


# 个人交叉编译器信息,非必须
export SDKTARGETSYSROOT=/opt/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi
export PATH=/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin:/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi:$PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
export CONFIG_SITE=/opt/poky/1.7/site-config-cortexa9hf-vfp-neon-poky-linux-gnueabi
export OECORE_NATIVE_SYSROOT="/opt/poky/1.7/sysroots/x86_64-pokysdk-linux"
export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT"
export OECORE_ACLOCAL_OPTS="-I /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/share/aclocal"
export PYTHONHOME=/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr#1.4版本的安装路径
export GOROOT_BOOTSTRAP=$GO_INSTALL_PATH/go
# 目标平台C代码编译器信息
export CC_FOR_TARGET=$GO_BUILD/go/src/arm_gcc.sh
# 目标平台C++代码编译器信息
export CXX_FOR_TARGET=$GO_BUILD/go/src/arm_g++.sh
# 目标平台编译器参数,非必须
export GOGCCFLAGS='-march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi -O2 -pipe -g -feliminate-unused-debug-types -fPIC -m64 -fmessage-length=0'

编译:

hegaozhi@ubuntu:~/go_build/go/src$ CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 ./make.bash

提示:当选择开启CGO编译时必须配置CC_FOR_TARGET和CXX_FOR_TARGET两个环境变量

经过编译之后$GO_BUILD/go目录下会生成arm和amd64两个平台的Go命令和依赖包,所以这个版本编译的Go命令可以进行两个平台的Go应用程序开发。

使用新编译的Go1.13版本替换旧的Go1.4:

cd $GO_BUILD
sudo rm $GO_INSTALL_PATH/go -rf
sudo cp -r go $GO_INSTALL_PATH/

设置运行环境变量

在/etc/bash.bashrc文件中添加如下内容(重启命令行后生效)):

export GOROOT_BOOTSTRAP=/usr/local/go
# 为了可以编译CGO的Go应用程序(ARM版本)必须要保留下面的两个环境变量
export CC_FOR_TARGET=$GOROOT_BOOTSTRAP/src/arm_gcc.sh
export CXX_FOR_TARGET=$GOROOT_BOOTSTRAP/src/arm_g++.sh
export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

验证Go

# 查看版本
xxx@ubuntu:~$ go version
go version go1.10.3 linux/amd6# 查看参数
xxx@ubuntu:~$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/hegaozhi/.cache/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/usr/local/gopath"
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build791570790=/tmp/go-build -gno-record-gcc-switches"

编译Helloworld程序,新建helloworld.go文件,并填入如下内容

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

编译ARM版本应用程序

xxx@ubuntu:~$ CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 go build helloworld.go

编译完成之后在当前目录下会生成helloworld,将此文件上传到ARM目标文件系统上执行测试。

查看生成helloworld文件属性:

xxx@ubuntu:~/golang$ file helloworld
helloworld: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), statically linked, not stripped

网络上golang调C例子

https://download.csdn.net/download/hgz_gs/12084628

Golang语言移植-ARM开发环境搭建相关推荐

  1. 我的全栈之路-C语言基础之C语言概述与开发环境搭建

    我的全栈之路-C语言基础之C语言概述与开发环境搭建 我的全栈之路 1.1 信息技术发展趋势 1.2 浅谈计算机系统架构 1.2.1 计算机系统架构概述 1.2.2 计算机硬件系统 1.2.2 计算机软 ...

  2. linux上 arm开发环境搭建,详解 LINUX下QT For ARM开发环境搭建过程

    LINUX下QT For ARM开发环境搭建过程是本文介绍的内容,不多说,先来看内容.在PC上,我们需要得到两个版本的Qt,分别是:Qt-4.5.2和QtEmbedded-4.5.2-arm.前者包括 ...

  3. 关于FS4412的ARM开发环境搭建并点亮LED灯

    目录 一.ARM开发环境搭建 1.安装 GCC 编译工具 2.安装 Yagarto 工具包 3.安装FS-JTAG调试软件 4.安装JRE 5.安装FS-JTAG驱动 6.安装USB转串口驱动 7.安 ...

  4. 嵌入式LINUX搭建arm环境,手把手教你嵌入式ARM开发环境搭建

    原标题:手把手教你嵌入式ARM开发环境搭建 1. 安装,配置,启动FTP服务 · 安装FTP: sudo apt-get install vsftpd · 修改vsftpd的配置文件/etc/vsft ...

  5. C语言核心技术-C语言概述与开发环境搭建

    C语言概述 C语言发展简史 起源 1972年,贝尔实验室的Dennis Ritchie和Ken Thompson在开发Unix操作系统时设计了C语言,该操作系统的90%以上的代码都是由C语言实现,后期 ...

  6. c语言制表符_随时随地学习C语言之1—开发环境搭建

    上一篇文章<C语言常用的集成开发环境有哪些?你用哪个?>介绍了C语言常用的集成开发环境,本文正式开始<随时随地学习C语言系列>连载文章.在这里面,我会把自己学习.使用C语言时的 ...

  7. 高云FPGA系列教程(1):FPGA和ARM开发环境搭建

    文章目录 @[toc] 1. 获取安装包 2. 申请License 3. 安装高云FPGA开发环境 4. 安装高云MCU开发环境 5. 替换TangNano 4K专用下载软件 总结 本文是高云FPGA ...

  8. Linux下ARM开发环境搭建

    本人的系统环境:Linux ubuntu 3.8.0-35-generic #50-Ubuntu SMP Tue Dec 3 01:25:33 UTC 2013 i686 i686 i686 GNU/ ...

  9. QT5.7.0 arm开发环境搭建

    参考文章http://blog.csdn.net/singleroot/article/details/54344873 1.创建项目 创建一个c++项目,但是发现平台没有arm的平台,需要我们自己添 ...

  10. Python基础笔记_Day01_计算机基础知识和Python开发环境搭建

    Day01_计算机基础知识和Python开发环境搭建 目录 01.01_计算机基础知识(计算机概述)(了解) 01.02_计算机基础知识(软件开发和计算机语言概述)(了解) 01.03_计算机基础知识 ...

最新文章

  1. 给力2011-东莞市南洋计算机软件有限公司 携手10大厂商提供企业安全有效节省成本解决方案...
  2. gin context和官方context_gin 源码阅读(一) -- 启动
  3. python变量存为matlab,详解如何在python中读写和存储matlab的数据文件(*.mat)
  4. python工程师是什么专业-猎维科技告诉你人工智能工程师与Python工程师有什么区别?...
  5. lightoj1060_组合数学
  6. 什么是透明传输 点对多传输? 它们有哪些经典应用和优势特点
  7. cocos2d-x3.6 连连看随机地图实现
  8. link标签 rel=“ alternate“ 应用解析
  9. 怎样找一张图片的原图、出处?最全搜图网站+具体案例分享
  10. 用matlab开环增益,自控原理实验仿真部份
  11. 计算机主机的组成的两部分,计算机的主机由哪两个部分组成
  12. 那些年常见的前端bug (持续更新)
  13. 为什么在wps中调整了0.5倍行距,某一页的行数不会发生变化?
  14. 使用VeraCrypt进行整盘加密介绍
  15. Redis源码-String:Redis String命令、Redis String存储原理、Redis String三种编码类型、Redis字符串SDS源码解析、Redis String应用场景
  16. 从c++到java+android
  17. 跨过顺丰的中通能终成霸主吗?
  18. 微型计算机怎么没声音,电脑没有声音是怎么回事 电脑失声怎么解决【解决方法】...
  19. 【机器学习】HMM模型
  20. win7 64位旗舰版下载 iso_天正CAD T20天正建筑V4.0(32/64位)下载地址:转发后及提取密码...

热门文章

  1. 施柏阁保时捷设计酒店全球陆续开设15家酒店;汉庭新品旗舰店在武汉街道口商圈亮相;开元酒店用国潮赋能中高端品牌 | 全球旅报...
  2. 【BZOJ4200】【NOI2015】小园丁与老司机(动态规划,网络流)
  3. CodeSonar网络研讨会
  4. 悠歌“即时”游戏回合文案
  5. Unity 艺术字体制作
  6. c语言中十六进制减法,二进制十进制十六进制
  7. 运算放大器介绍与应用电路(LM358)
  8. 双歧杆菌基因组序列批量下载、基因组注释、antiSMASH合成基因簇挖掘、核心基因的同源性比较。
  9. Day4:《卫报》:我们正面临着第六次大灭绝吗?
  10. 【docker】win10系统下docker容器安装及使用(二):docker通过commit及dockerfile进行创建