Ubuntu 18.04 源码安装go编译器

声明

这篇文章介绍的是如何在Ubuntu 18.04 LTS下安装1.5及更高版本go语言编译环境的方法。由于1.5及更高版本的go语言编译器需要依赖go1.4版本,所以我们需要在安装1.4版本后,再安装更高版本。

前期准备

安装必要的工具

在命令行中输入

1
sudo apt-get install bison ed gawk gcc libc6-dev make

下载go语言封装包

前往https://golang.org/dl/,分别下载1.4版本及更高版本的封装包。这里以go1.12.7为例。注意,我们是在Linux Ubuntu系统下安装go的,因此下载的封装包,文件名应该是go1.xx.xx.linux-amd64.tar.gz

除了从网页上下载,你也可以用wget命令在终端直接下载:

1
wget https://dl.google.com/go/go1.4.linux-amd64.tar.gz
1
wget https://dl.google.com/go/go1.12.7.linux-amd64.tar.gz

设置环境变量

修改/etc/profile文件:

1
sudo vim /etc/profile

在结尾处添加

1
2
3
+	export GOROOT=$HOME/go
+ export PATH=$PATH:$GOROOT/bin
+ export GOPATH=$HOME/go_program

修改完之后,执行下面的命令使配置文件生效

1
source /etc/profile

注意

  • Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。使用修改/etc/profile 文件进行环境变量的编辑,是对所有用户有用。如果你修改的环境变量,只想对当前用户生效,那就对~/.bashrc文件进行环境变量的编辑,只对当前用户有用。

  • 不会使用vim的话,可以把命令行中的vim修改成gedit。不过还是推荐用vim,这边涉及到的操作是:按Insert进入插入模式,在文件结尾添加上面提到的三行代码。然后按Esc退回到命令行模式,按进入Last line mode,输入wq保存并退出就行啦。

  • $HOME是linux系统中预设好的环境变量,指向~所在的文件目录,如果你不知道在你系统中$HOME具体是哪里的话,可以在命令行中输入echo $HOME查看:

    1
    2
    swayye@swayye-ThinkPad-T470p:~$ echo $HOME
    /home/swayye
  • 在修改的/etc/profile中的最后一行,也就是GOPATH那一行代码,你可以自己指定文件目录,记得修改完/etc/profile之后,要自己去那个目录创建对应文件夹,以我为例:

    1
    mkdir /home/swayye/go_program

安装go1.4

cd到下载go1.4.linux-amd64.tar.gz的目录,解压压缩包:

1
tar -zxvf go1.4.linux-amd64.tar.gz

解压完成后,会在当前目录生成名为go的文件夹,将文件夹移到/home/xxx,xxx为计算机名,并将文件名改为go1.4

1
mv go /home/xxx/go1.4

安装go1.4编译器

1
2
cd go1.4/src
sudo CGO_ENABLED=0 ./make.bash

上文提到过,安装1.4以上的go编译器需要依赖1.4版本,这个在编译器领域叫bootstrapping,中文翻译叫自举自展,通俗地讲“用要编译的目标语言编写其编译器。

Go 1.5开始编译器和运行时用go自身编写,all.bash 编译脚本会在$GOROOT_BOOTSTRAP环境变量中查找一个已经存在的go tool chain,实际上就是要有一个编译好的bin/go程序。这里我们运行好1.4版本的./make.bash后,会在/home/xxx/go1.4/bin生成一个二进制文件,现在我们把它添加为$GOROOT_BOOTSTRAP环境变量:

1
export GOROOT_BOOTSTRAP=/home/swayye/go1.4

这样我们就可以编写更高版本的go编译器了

安装go1.12.7

同样地,解压1.12.7

1
tar -zxvf go1.4.linux-amd64.tar.gz

将解压出来的go文件夹移到/home/xxx

1
mv go /home/swayye

安装1.12.7

1
2
cd /home/swayye/go/src
./all.bash

在完成安装后输入go env,如显示以下内容,说明成功了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
swayye@swayye-ThinkPad-T470p:~$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/swayye/.cache/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/swayye/go_program"
GOPROXY=""
GORACE=""
GOROOT="/home/swayye/go"
GOTMPDIR=""
GOTOOLDIR="/home/swayye/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
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-build290674534=/tmp/go-build -gno-record-gcc-switches"

你还可以测试一个简单的代码:

文件位置:/home/swayye/go_program/hello.go
1
2
3
4
5
package main

func main(){
println("Hello", "world")
}

运行代码:

1
go run hello.go

输出Hello world,说明就没有什么问题了。

参考文献

0%