编译GO 1.6版本以上的需要依赖GO 1.4版本的二进制,并且需要把GOROOT_BOOTSTRAP的路径设置为1.4版本GO的根目录,这样它的bin目录就可以直接使用到1.4版本的GO

搭建go语言开发环境只需要:

  编译go1.4版本,设置好GOROOT_BOOTSTRAP,然后再执行脚本编译安装GO1.6以上版本

有关资料:

https://www.cnblogs.com/schips/p/10465706.html

 

开发环境介绍

  • 主机操作系统: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编译器(Host)

从Go1.4之后Go语言的编译器完全由Go语言编写,所以为了从源代码编译Go需要先编译一个1.4版本的Go版本。
wget -c https://github.com/golang/go/archive/go1.4.2.tar.gz
下载完成之后将得到一个go1.4-bootstrap-20171003.tar.gz压缩包,接下来进行解压编译:
 
sudo tar -xf go-go1.4.2.tar.gz -C /usr/local
cd /usr/local/go-go1.4.2/src
 GOOS=linux GOARCH=amd64 ./make.bash
 
# schips @ ubuntu in /usr/local/go-go1.4.2/src [15:54:23]
$ sudo GOOS=linux GOARCH=amd64 ./make.bash
# Building C bootstrap tool.
cmd/dist
 
 
# Building compilers and Go bootstrap tool for host, linux/amd64.
lib9
/usr/local/go-go1.4.2/src/lib9/fmt/fltfmt.c: In function ‘__efgfmt’:
/usr/local/go-go1.4.2/src/lib9/fmt/fltfmt.c:437:5: error: this statement may fall through [-Werror=implicit-fallthrough=]
   if(ndigits > prec) {
     ^
/usr/local/go-go1.4.2/src/lib9/fmt/fltfmt.c:451:2: note: here
  default:
  ^~~~~~~
cc1: all warnings being treated as errors
go tool dist: FAILED: gcc -Wall -Wstrict-prototypes -Wextra -Wunused -Wno-sign-compare -Wno-missing-braces -Wno-parentheses -Wno-unknown-pragmas -Wno-switch -Wno-comment -Wno-missing-field-initializers -Werror -fno-common -ggdb -pipe -Wuninitialized -O2 -fmessage-length=0 -c -m64 -I /usr/local/go-go1.4.2/include -DPLAN9PORT -I /usr/local/go-go1.4.2/src/lib9 -o $WORK/fltfmt.o /usr/local/go-go1.4.2/src/lib9/fmt/fltfmt.c
 
 
如果出现了 将 警告当成错误的 情况,去掉有关编译脚本中的 -Werror 选项
# schips @ ubuntu in /usr/local/go-go1.4.2/src [15:55:37] C:1
$ grep "Werror" . -nR
sudo vi /usr/local/go-go1.4.2/src/make.bash
sudo vi /usr/local/go-go1.4.2/src/cmd/dist/build.c
sudo CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash

设置环境变量

在自己的bash中/etc/bash.bashrc文件中添加如下内容(重启命令行后生效)):
(此时的 go版本是 1.4)
export GOROOT_BOOTSTRAP=/usr/local/go-go1.4.2
export CC_FOR_TARGET=***自己arm-linux-gcc的路径
export CXX_FOR_TARGET=***自己arm-linux-g++的路径
 
 
 
 
编译Go(ARM)
 
完成Go1.4的编译之后,可以利用Go1.4来编译新版本的Go,这里提供
 
tar -zxvf go-go1.12.tar.gz
cd go-go-1.12/src
(下面2条命令2选1)
# 开启CGO编译
CGO_ENABLED=1 GOOS=linux GOARCH=arm GOARM=7 ./make.bash
# 关闭CGO编译
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 ./make.bash
 
自从golang1.5以后go就使用go语言编译器进行编译了。在golang1.9当中没有使用CGO_ENABLED参数发现依然可以正常编译。当然使用了也可以正常编译。比如把CGO_ENABLED参数设置成1,即在编译的过程当中使用CGO编译器,我发现依然是可以正常编译的。实际上如果在go当中使用了C的库,比如import "C"默认使用go build的时候就会启动CGO编译器,当然我们可以使用CGO_ENABLED=0来控制go build是否使用CGO编译器。
 
这里用到了两个变量:
  • 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.
 
 
经过编译之后go-go1.12目录下会生成arm和amd64两个平台的Go命令和依赖包,所以这个版本编译的Go命令可以进行两个平台的Go应用程序开发。
删除原来的1.4版本,将生成后的新版本的go编译器拷贝到自己的工具链下面
sudo rm /usr/local/go -rf
sudo cp go1.12 /usr/local/go
 
 
在自己的bash中/etc/bash.bashrc文件中添加如下内容(重启命令行后生效)):
export GOROOT=/usr/local/go
export GOPATH=/usr/local/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
 
新开一个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
 
 
$ GOOS=linux GOARCH=arm GOARM=7 go build  helloworld.go
$ ./helloworld
zsh: exec format error: ./helloworld
 
 
 
#For swtich the cross cmoplier
ARMLINUXGCC="XILINX"
ARMLINUXGCC="ARM-2009"
#ARMLINUXGCC="ARM-2014"
#ARM_GCC_PATH
if [ $ARMLINUXGCC = "XILINX" ]
then
    ARM_GCC_PATH="/usr/arm-xilinx-linux-gnueabi/bin"
else if [ $ARMLINUXGCC = "ARM-2014" ]
then
    ARM_GCC_PATH="/usr/local/arm/arm-2014.05/bin"
else
    ARM_GCC_PATH="/usr/local/arm/arm-2009q3/bin"
    fi
fi
export PATH=$PATH:$ARM_GCC_PATH
echo -e "GCC :\033[33m $ARMLINUXGCC \033[0m"
export PATH=$PATH:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/bin
export PATH=$PATH:/usr/local/arm/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi/bin
 
 
#For Golang
if [ $ARMLINUXGCC = "XILINX" ]
then
    GO_CC_FOR_TARGET="$ARM_GCC_PATH/arm-xilinx-linux-gnueabi-gcc"
    GO_CXX_FOR_TARGET="$ARM_GCC_PATH/arm-xilinx-linux-gnueabi-g++"
else
    GO_CC_FOR_TARGET="$ARM_GCC_PATH/arm-none-linux-gnueabi-gcc"
    GO_CXX_FOR_TARGET="$ARM_GCC_PATH/arm-none-linux-gnueabi-g++"
fi
export GOROOT_BOOTSTRAP=/usr/local/go
export CC_FOR_TARGET=$GO_CC_FOR_TARGET
export CXX_FOR_TARGET=$GO_CXX_FOR_TARGET
export GOROOT=/usr/local/arm/go
export GOPATH=/usr/local/arm/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
alias arm-go="GOOS=linux GOARCH=arm GOARM=7 go build"
alias gob="go build"
 
 
 
 
 

2019.03.03 - Linux搭建go语言交叉环境的更多相关文章

  1. 从零开始搭建Go语言开发环境

    一步一步,从零搭建Go语言开发环境. 安装Go语言及搭建Go语言开发环境 下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://gol ...

  2. 安装Go语言及搭建Go语言开发环境

    一步一步,从零搭建Go语言开发环境. 安装Go语言及搭建Go语言开发环境 下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站(推荐):https://gol ...

  3. GO学习-(2) 从零开始搭建Go语言开发环境

    从零开始搭建Go语言开发环境 一步一步,从零搭建Go语言开发环境. 安装Go语言及搭建Go语言开发环境 下载 下载地址 Go官网下载地址:https://golang.org/dl/ Go官方镜像站( ...

  4. SublimeText3搭建go语言开发环境(windows)

    SublimeText3搭建go语言开发环境(windows) 下载并解压:     Sublime Text Build 3021.zip注册:     尽量不要去破解    安装Package C ...

  5. Windows10下配置Linux下C语言开发环境

    今天为大家介绍如在Windows10下配置Linux下C语言开发环境,首先安装linux子系统:启用开发者模式 1.打开设置 2.点击更新和安全3.点击开发者选项 4.启用开发人员模式 5.更改系统功 ...

  6. Win7下搭建Go语言开发环境

    Win7下搭建Go语言开发环境 1 下载适合window版本的Go安装包,下载地址http://code.google.com/p/go/downloads/list 2 下载适合window本本的L ...

  7. 干货分享:在Windows下使用Visual Studio搭建C语言开发环境

    前言:本文将教大家如何使用 VIsual Studio Code 搭建 C 语言开发环境,包括使用 VS Code 如何编译和调试 C 语言程序,需要 用到的工具有 Visual Studio Cod ...

  8. 实验四 Linux系统搭建C语言编程环境

    项目 内容 这个作业属于那个课程 <班级课程的主页链接> 这个作业的要求在哪里 <作业要求链接地址> 学号-姓名 17043220-万文文 作业学习目标 1).Linux系统下 ...

  9. AbelSu教你搭建go语言开发环境

    go语言官网:https://golang.org/ windows:官网下载go1.6.windows-amd64.msi安装文件,安装位置选择默认C:\Go\安装结束后配置环境变量Path: C: ...

随机推荐

  1. HDU1251 字典树板子题

    题意:中文题,统计以某字符串作为前缀的字符串个数 刚学字典树,理解起来十分简单,就是维护一个多叉树,这里用的是链表版本,后面就用的是数组版本了,个人更喜欢数组版本,这里的链表版本就因为 莫名其妙的错误 ...

  2. UOJ268 [清华集训2016] 数据交互 【动态DP】【堆】【树链剖分】【线段树】

    题目分析: 不难发现可以用动态DP做. 题目相当于是要我求一条路径,所有与路径有交的链的代价加入进去,要求代价最大. 我们把链的代价分成两个部分:一部分将代价加入$LCA$之中,用$g$数组保存:另一 ...

  3. verilog parameter 位宽问题

    前言 一直以为parameter 的位宽是无限的,其实不然. 流程: 仿真一下就知道啦: 用处: 精准控制位宽理论上会占用更少的内存,其他好像并没有什么卵用,注意不要越界,我这里系统默认32bit位宽 ...

  4. atcoder NIKKEI Programming Contest 2019 E - Weights on Vertices and Edges

    题目链接:Weights on Vertices and Edges 题目大意:有一个\(n\)个点\(m\)条边的无向图,点有点权,边有边权,问至少删去多少条边使得对于剩下的每一条边,它所在的联通块 ...

  5. Java的equals方法,首先要判断类型是否相同

    如下代码,Long 和Integer 进行比较: Integer aa = 1; Long bb= 1L; System.out.println(aa.equals(bb)); 输出为:false 查 ...

  6. IT人员必须掌握的10项软技能

    现代企业的IT部门员工在具备技术能力的同时,还需要掌握一些软技能.现在来看这些软技能其实并不是什么新鲜事物,只是IT人员所需的这些软技能的范围与数量正在不断增加着. IT人员需要具备哪些技术能力,要取 ...

  7. Codeforces Round #555 (Div. 3)[1157]题解

    不得不说这场div3是真的出的好,算得上是从我开始打开始最有趣的一场div3.因为自己的号全都蓝了,然后就把不经常打比赛的dreagonm的号借来打这场,然后...比赛结束rank11(帮dreago ...

  8. cf1088E Ehab and a component choosing problem (树形dp)

    题意(考试时看错了对着样例wa了好久..):从树上选k个连通块,使得权值的平均值最大的基础上,选的块数最多 如果不考虑块数最多的限制,肯定是只选一个权值最大的块是最好的 然后只要看这个权值最大的块有多 ...

  9. Bomb HDU - 5934 (Tarjan)

    #include<map> #include<set> #include<ctime> #include<cmath> #include<stac ...

  10. ftp sun jdk自带

    package com.italktv.colnv.stat.util; import java.io.File; import java.io.FileInputStream; import jav ...