Linux系列讲解 —— Ubuntu18.04安装gcc 9.1.0(C++17)

1. 下载gcc 9.1.0源码压缩包

国内镜像地址:https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.1.0/
在这里插入图片描述

2. 解压缩包

将压缩包放到一个目录下(本例为~/myproject/gcc),然后解压

sun@sun-pc:~/myproject/gcc$ tar -zxvf gcc-9.1.0.tar.gz
...
sun@sun-pc:~/myproject/gcc$ ls
gcc-9.1.0  gcc-9.1.0.tar.gz

3. 检查并配置源码编译的环境

执行自带的configure即可

sun@sun-pc:~/myproject/gcc$ mkdir build    #创建个目录专门用于存放编译文件等
sun@sun-pc:~/myproject/gcc$ cd build
sun@sun-pc:~/myproject/gcc/build$ ../gcc-9.1.0/configure
sun@sun-pc:~/myproject/gcc/build$ ls
config.log  config.status  Makefile  serdep.tmp  #成功后可以看到生成了Makefile文件

注: 如果configure执行失败,报错如下

checking build system type... x86_64-pc-linux-gnu
...
configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
...

提示有三个库找不到,分别是GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+
进入gcc源码目录,使用download_prerequisites脚本下载安装缺失的库,如下:

sun@sun-pc:~/myproject/gcc/gcc-9.1.0$ ./contrib/download_prerequisites

如果上面的download_prerequisites命令由于网络超时导致下载失败,这里提供两个方法解决:


方法1:可以尝试更改download_prerequisites的url,然后重新执行download_prerequisites

#base_url='ftp://gcc.gnu.org/pub/gcc/infrastructure/'
base_url='http://mirror.linux-ia64.org/gnu/gcc/infrastructure/'

方法2:直接浏览器访问http://mirror.linux-ia64.org/gnu/gcc/infrastructure/下载gmp-6.1.0.tar.bz2,mpfr-3.1.4.tar.bz2,mpc-1.0.3.tar.gz(其他版本只要大于提示的GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+都可以),然后解压后做好链接

sun@sun-pc:~/myproject/gcc/gcc-9.1.0$ tar -jxvf gmp-6.1.0.tar.bz2
sun@sun-pc:~/myproject/gcc/gcc-9.1.0$ tar -zxvf mpc-1.0.3.tar.gz
sun@sun-pc:~/myproject/gcc/gcc-9.1.0$ tar -jxvf mpfr-3.1.4.tar.bz2
sun@sun-pc:~/myproject/gcc/gcc-9.1.0$ ls
... gmp-6.1.0 mpc-1.0.3 mpfr-3.1.4 ...     #解压后生成的三个目录
sun@sun-pc:~/myproject/gcc/gcc-9.1.0$ ln -s gmp-6.1.0 gmp
sun@sun-pc:~/myproject/gcc/gcc-9.1.0$ ln -s mpc-1.0.3 mpc
sun@sun-pc:~/myproject/gcc/gcc-9.1.0$ ln -s mpfr-3.1.4 mpfr

5. 编译gcc源码

sun@sun-pc:~/myproject/gcc/build$ make -j8

6. 安装gcc

使用下面命令进行安装,默认的可执行文件安装路径为/usr/local/bin/,默认的库安装路径为/usr/local/lib/

sun@sun-pc:~/myproject/gcc/build$ sudo make install

Tips:
usr的全称:Unix System Resource

7. 使用update-alternatives管理本地多个版本的gcc和g++

如果本地有多个版本的gcc,可以考虑用update-alternatives进行管理
下面只讲解gcc配置过程,之后记得把g++也配置一下

7.1 查看本地安装了哪几个gcc程序

#查看gcc的可执行文件及库文件位置,可以看到有两处
sun@sun-pc:~$ whereis gcc
gcc: /usr/bin/gcc /usr/lib/gcc /usr/local/bin/gcc /usr/local/lib/gcc /usr/share/man/man1/gcc.1.gz
#/usr/bin/gcc是原先安装的7.5.0版本
sun@sun-pc:~$ ls -l /usr/bin/gcc
lrwxrwxrwx 1 root root 5 521  2019 /usr/bin/gcc -> gcc-7

#/usr/local/bin/gcc是本次安装的9.1.0版本
sun@sun-pc:~$ ls -l /usr/local/bin/gcc
-rwxr-xr-x 3 root root 7111040 821 14:33 /usr/local/bin/gcc

#使用gcc命令查看版本,可以看到是9.1.0,说明终端里执行的程序是/usr/local/bin下的gcc
sun@sun-pc:~$ gcc --version
gcc (GCC) 9.1.0
Copyright © 2019 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。

问:为什么gcc命令默认是执行的/usr/local/bin/gcc,而不是/usr/bin/gcc ?
答:看下图,终端的环境变量中,/usr/local/bin在/usr/bin之前,所以优先执行/usr/local/bin下的程序。
在这里插入图片描述

7.2 update-alternatives中安装本地所有版本gcc

先切换到root用户,然后执行下面命令分别将两个版本的gcc配置到update-alternatives列表中。

1. 配置gcc 7.5.0到update-alternatives列表
root@sun-pc:~# update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 1
update-alternatives: 使用 /usr/bin/gcc-7 来在自动模式中提供 /usr/bin/gcc (gcc)

2. /usr/local/bin/gcc和gcc命令名字冲突,配置gcc 9.1.0之前先更改一下/usr/local/bin/gcc的名字
root@sun-pc:~# mv /usr/local/bin/gcc /usr/local/bin/gcc-9
root@sun-pc:~# update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/gcc-9 2
update-alternatives: 使用 /usr/local/bin/gcc 来在自动模式中提供 /usr/bin/gcc (gcc)

至于具体如何使用请查看Linux系列讲解 —— 本地软件版本管理工具update-alternatives,此处就不在详述了。

/usr/local/bin/gcc需要改名的原因:
上面7.1提到过会优先执行/usr/local/bin下的gcc,如果不改名,在终端输入gcc命令时,系统先在/usr/local/bin/下找到了gcc,那么就会执行这个路径的gcc,而不会执行/usr/bin下的符号链接gcc。那么update-alternatives更换gcc链接路径也就没有意义了。

猜你喜欢

转载自blog.csdn.net/In_engineer/article/details/126445658