背景

Go是一门全新的静态类型开发语言,具有自动垃圾回收丰富的内置类型,函数多返回值错误处理匿名函数,并发编程反射等特性。

从Go1.4之后Go语言的编译器完全由Go语言编写,所以为了从源代码编译Go需要先编译一个1.4版本的Go版本。

所以,搭建go语言开发环境(版本>1.4)只需要:

1)编译go1.4版本,设置好GOROOT_BOOTSTRAP

2)然后再执行脚本编译安装GO1.4以上版本(任何支持的平台都可以)

注意,go的安装/移植 比较奇怪,它是以 源码包当前的路径作为根目录的,相当于prefix =PWD

有关资料: 【英文文档】 Installing Go from source Go语言官方编译指南 2019.02.27

开发环境介绍

  • 主机操作系统:Ubuntu18.04 64位
  • 目标平台:S5P6818(ARM-A53)
  • 交叉工具链:arm-none-linux-gnueabi-gcc,gcc7.3.0
  • Go版本:1.12 (https://github.com/golang/go/releases)
  • 编译时间:2019.03.03

准备Go Bootstrap

编译3个版本

##
# Copyright By Schips, All Rights Reserved
# https://gitee.com/schips/ # File Name: make.sh
# Created : Tue 25 Feb 2020 03:05:11 PM CST ##
#!/bin/sh
# 注意 go 的脚本不具备通用性
BUILD_HOST=arm-linux
BASE=`pwd` ARM_GO_DIR=${BASE}/source/_arm_go
HIG_GO_DIR=${BASE}/source/_go_higher
BOOTSTRAP_DIR=${BASE}/source/_go_boot_strap GOROOT_BOOTSTRAP=${BOOTSTRAP_DIR}/go CROSS_TOOL_DIR=`dirname \`whereis ${BUILD_HOST}-gcc | awk -F: '{ print $2 }'\`` make_dirs () {
#为了方便管理,创建有关的目录
cd ${BASE} && mkdir compressed install source -p
} tget () { #try wget
filename=`basename $1`
echo "Downloading [${filename}]..."
if [ ! -f ${filename} ];then
wget $1
fi echo "[OK] Downloaded [${filename}] "
} download_package () {
cd ${BASE}/compressed tget https://dl.google.com/go/go1.4.3.src.tar.gz
# 高版本
tget https://dl.google.com/go/go1.13.8.src.tar.gz
} tar_go_for_boot_stap () {
cd ${BASE}/compressed mkdir ${BOOTSTRAP_DIR} -p
tar -xf *go1.4* -C ${BOOTSTRAP_DIR}
} make_go_for_boot_stap () {
cd ${BOOTSTRAP_DIR}/go/src CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash
} tar_go_version_higher_host () {
cd ${BASE}/compressed
HIGHER=`ls go* | grep -v 1.4 ` mkdir ${HIG_GO_DIR} -p
tar -xf $HIGHER -C ${HIG_GO_DIR}
} make_go_version_higher_host() {
export GOROOT_BOOTSTRAP=$GOROOT_BOOTSTRAP cd ${HIG_GO_DIR}/go/src
GOOS=linux GOARCH=amd64 ./make.bash
} tar_go_version_higher_arm () {
cd ${BASE}/compressed
HIGHER=`ls go* |grep -v 1.4 `
mkdir ${ARM_GO_DIR} -p
tar -xf $HIGHER -C ${ARM_GO_DIR}
} make_go_version_higher_arm() {
export GOROOT_BOOTSTRAP=$GOROOT_BOOTSTRAP cd ${ARM_GO_DIR}/go/src
CGO="no"
if [ $CGO = "yes" ]
then
echo "CGO is enable"
# 开启CGO编译(参考下文)
export CC_FOR_TARGET=${CROSS_TOOL_DIR}/${BUILD_HOST}-gcc
export CXX_FOR_TARGET=${CROSS_TOOL_DIR}/${BUILD_HOST}-g++
CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 ./make.bash
else
echo "CGO is disable"
# 关闭CGO编译
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 ./make.bash
fi } make_together () {
#boot strap
mv ${BOOTSTRAP_DIR}/go ${BASE}/install/go_boot_strap #higher_host(好像arm版本的编译里面也自带了本机可以用的go)
#mv ${HIG_GO_DIR}/go ${BASE}/install/go_host #higher_arm
mv ${ARM_GO_DIR}/go ${BASE}/install/go_arm echo "go bootstarp is : $GOROOT_BOOTSTRAP"
echo "CC_FOR_TARGET is : ${CROSS_TOOL_DIR}/${BUILD_HOST}-gcc"
echo "CXX_FOR_TARGET is : ${CROSS_TOOL_DIR}/${BUILD_HOST}-g++" # 关于下方的变量请参考有关文章
GOROOT="${BASE}/install/go_host"
GOPATH=`dirname $GOROOT`/gopath
echo "GOROOT is : ${GOROOT}"
echo "GOPATH is : ${GOPATH}" } echo "Using ${BUILD_HOST}-gcc"
make_dirs
download_package tar_go_for_boot_stap
make_go_for_boot_stap #好像arm版本的编译里面也带了本机可以用的go,
# tar_go_version_higher_host
#make_go_version_higher_host tar_go_version_higher_arm
make_go_version_higher_arm make_together

编译完成以后,最后会提示应该如何配置环境变量(在下文中需要用到)

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

建议 高版本的go设置CGO=0;建议 arm版本的go 设置CGO=1。

脚本中编译go的时候,用到了两个变量:

  • GOOS:目标操作系统
  • GOARCH:目标操作系统的架构
OS ARCH OS version
linux 386 / amd64 / arm >= Linux 2.6
darwin 386 / amd64 OS X (Snow Leopard + Lion)
freebsd 386 / amd64 >= FreeBSD 7
windows 386 / amd64 >= Windows 2000

编译其他平台的时候根据上面表格参数执行编译就可以了。

    • $GOARM (for arm only; default is auto-detected if building on the target processor, 6 if not)

      This sets the ARM floating point co-processor architecture version the run-time should target. If you are compiling on the target system, its value will be auto-detected.

      • GOARM=5: use software floating point; when CPU doesn't have VFP co-processor
      • GOARM=6: use VFPv1 only; default if cross compiling; usually ARM11 or better cores (VFPv2 or better is also supported)
      • GOARM=7: use VFPv3; usually Cortex-A cores

If in doubt, leave this variable unset, and adjust it if required when you first run the Go executable. The GoARM page on the Go community wiki contains further details regarding Go's ARM support.

设置环境变量

在自己的bash中的对应资源文件(*rc)中添加如下内容(重启命令行后生效)):

不同bash对应rc文件也不同,比如 .ashrc,.bashrc,.zshrc 等

关于 go有关的环境变量可以参考: 《GOROOT、GOPATH、GOBIN变量的含义》

# 设置 GOROOT_BOOTSTRAP是为了下次 编译的时候可以用
export GOROOT_BOOTSTRAP=根据上面脚本的编译结果
export CC_FOR_TARGET=根据上面脚本的编译结果
export CXX_FOR_TARGET=根据上面脚本的编译结果 # 一定需要的
export GOROOT=根据上面脚本的编译结果
export GOPATH=可以参考根据上面脚本的编译结果
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin # 可选的,快捷命令
alias arm-go="GOOS=linux GOARCH=arm GOARM=7 go build"
alias gob="go build"

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

# schips @ ubuntu in ~/host/go/install/go_arm/bin [20:57:41]
$ tree
.
├── go(PC上正常使用的)
├── gofmt
└── linux_arm(这个目录下的程序是在arm上运行的)
├── go
└── gofmt

测试

验证go 是否正常运行 以及 输出版本

新开一个bash,输入 go version 可以进行安装的简单验证:

$ go version

go version go1.12 linux/amd64

有关程序的验证

新建helloworld.go

package main

import "fmt"

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

编译与运行

在本地运行的结果:

go build helloworld.go

./helloworld
Hello world

在板子上:

# 在 host 上交叉编译
GOOS=linux GOARCH=arm GOARM=7 go build helloworld.go [root@6818 ~/nfs]#./helloworld
Hello world

Linux 安装 go 以及 arm linux 移植 go的更多相关文章

  1. Linux安装jsvc,及Linux服务开发

    在linux上以服务的方式启动java程序,需要提前安装jsvc.linux是利用daemon(jsvc)构建java守护进程. 编译 daemon 安装JSVC 1 下载文件,http://comm ...

  2. Ubuntu linux安装完成后隐藏linux磁盘挂载点

    方案1 打开注册表 , 找到这个位置: 计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explore ...

  3. 构建 ARM Linux 4.7.3 嵌入式开发环境 —— U-BOOT 引导 Kernel

    经过若干天的反复测试,搜索.终于成功利用 Qemu 在 u-boot 下引导 ARM Linux 4.7.3 内核.如下详细解释整个构建过程. 准备环境 运行环境:Ubuntu 16.04 需要的虚拟 ...

  4. Linux安装Oracle 11G过程(测试未写完)

    一.简介 Oracle数据库在系统运维中的重要性不言而喻,通过熟悉Oracle的安装来加深对操作系统和数据库知识的了解.Linux安装Oracle前期修改linux内核参数很重要,其实就是linux下 ...

  5. 服务器搭建--Linux安装rabbitmq

    安装rabbitmq需要先安装erlang:安装erlang参考https://blog.csdn.net/ztx114/article/details/79912570 1.下载rabbitmq-s ...

  6. 服务器搭建--Linux安装erlang

    1.安装依赖环境: 1)安装GCC GCC-C++ Openssl等模块,安装过就不需要安装了 yum -y install make gcc gcc-c++ kernel-devel m4 ncur ...

  7. 20165211 预备作业3 Linux安装与学习

    20165211 预备作业3 Linux安装与学习 1. Linux安装 涉及软件:VirtualBox,Ubuntu 参考教程:基于VirtualBox安装Ubuntu图文教程 安装过程的问题 在安 ...

  8. 【Maven】安装及配置(Linux)

    本文介绍Linux环境下安装Maven 安装环境和软件 系统:Linux(CentOS) 软件:apache-maven-3.3.9-bin.tar.gz(解压版). 安装步骤 maven是基于Jav ...

  9. Linux安装搜狗拼音输入法-sogoupinyin

    Linux安装搜狗拼音输入法-sogoupinyin Linux安装搜狗拼音输入法-sogoupinyin 一.下载所需安装包 二.卸载原有输入法 三.安装 四.安装配置工具 在网上查资料安装好了搜狗 ...

随机推荐

  1. ZooKeeper 相关知识

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zhang123456456/articl ...

  2. redis实现哨兵机制

    将cd /usr/local/redis/sentinel.conf复制到/usr/local/redis/etc/下 cd /usr/local/redis/ cp sentinel.conf /u ...

  3. MySQL高级 InnoDB 和 MyISAM 的区别

    InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...

  4. Django 学习之Django Rest Framework(DRF)

    一. WEB应用模式 在开发Web应用中,有两种应用模式 1. 前后端不分离 把html模板文件和django的模板语法结合渲染完成以后才从服务器返回给客户. 2. 前后端分离 二. API接口 AP ...

  5. JAVA中final关键字的作用

    一.final关键字的功能概述 final关键字可以用来修饰引用.方法和类. 1.用来修饰一个引用 如果引用为基本数据类型,则该引用为常量,该值无法修改: 如果引用为引用数据类型,比如对象.数组,则该 ...

  6. AT2827 最长上升子序列LIS(nlogn的DP优化)

      题意翻译 给定一长度为n的数列,请在不改变原数列顺序的前提下,从中随机的取出一定数量的整数,并使这些整数构成单调上升序列. 输出这类单调上升序列的最大长度. 数据范围:1<=n<=10 ...

  7. Linux centos7 linux任务计划cron、chkconfig工具、systemd管理服务、unit介绍、 target介绍

    一.linux任务计划cron crontab -u  -e -l -r 格式;分 时 日 月 周 user command 文件/var/spool/corn/username 分范围0-59,时范 ...

  8. SpringBoot 集成MyBatis、事务管理

    集成MyBatis (1)在pom.xml中添加依赖 <!-- mybatis的起步依赖.包含了mybatis.mybatis-spring.spring-jdbc(事务要用到)的坐标 --&g ...

  9. Write-up-NODE-1

    关于 下载地址:点我 哔哩哔哩:哔哩哔哩 一天研究OBS终于不闪屏了 顺便在这里记录一下,上网查了很久.刚刚开始是不闪屏了,但是锁屏后就唤醒不了了,只能强制关机. 然后又上网找了很久,重启了N次,终于 ...

  10. 操作Easy_UI案例以及模板

    操作easy_ui案例以及模板 https://pan.baidu.com/s/1dHfclwP  密码:jygk