0. 确认基本编译工具已安装,退出其他管理环境
下载基本编译工具:sudo apt install build-essential
这会默认配置某一个版本的gcc环境,后续编译新的gcc环境也需要它。
退出其他管理环境,如 conda
1. 下载所需版本源码
官方镜像站点目录
清华镜像地址
gcc-8.5.0.tar.gz CSDN下载
使用 tar -zxvf 文件名.tar.gz 进行解压,该解压后的文件夹之后称为 “gcc源码文件夹”
2. 下载依赖包源码
不同版本gcc所需依赖库不尽相同,具体可以进入gcc源码文件夹中 contrib/download_prerequisites 文件中查看,如 gcc-8.5.0 的该文件中有以下内容:
gmp='gmp-6.1.0.tar.bz2'
mpfr='mpfr-3.1.4.tar.bz2'
mpc='mpc-1.0.3.tar.gz'
isl='isl-0.18.tar.bz2'base_url='ftp://gcc.gnu.org/pub/gcc/infrastructure/'
说明需要上述列出的4个依赖包,且下载地址如上所列,如果上述地址不好访问,可以手动修改到其他镜像地址,如:
base_url = 'http://ftp.tsukuba.wide.ad.jp/software/gcc/infrastructure/'
上述是日本镜像地址,暂时没有该地址的内地镜像。
如果网络不佳,可以手动下载上述依赖包到gcc源码文件夹之下(建议版本相同),这里提供两种下载方式:
- 访问 gnu 镜像地址,依次进入相应文件夹,选择对应版本下载,如访问 清华镜像地址 ,进入gmp文件夹,选择
gmp-6.1.0.tar.bz2
下载 - Gitee 地址
下载好后在gcc源码文件夹中执行命令./contrib/download_prerequisites
查看是否安装完好,正常将会输出以下内容:
gmp-6.1.0.tar.bz2: OK
mpfr-3.1.4.tar.bz2: OK
mpc-1.0.3.tar.gz: OK
isl-0.18.tar.bz2: OK
All prerequisites downloaded successfully.
如果有如下报错,可能是压缩软件不全所致:
tar (child): lbzip2: Cannot exec: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
只需执行 sudo apt install bzip2
即可。(CentOS系统执行 sudo yum install bzip2
)
此命令不仅会检查依赖包,还会同时解压、生成依赖包的软链接,如果没有执行此步,可以手动解压,并添加软链接,软链接名字为不带版本号的名字。 例如对 gmp-6.1.0 解压并生成软链接:
- 进入gcc源码文件夹,执行
tar -vxf gmp-6.1.0.tar.bz2
解压,生成文件夹 gmp-6.1.0 - 执行
ln -s gmp-6.1.0 gmp
生成名为gmp的软链接。
3. 编译安装gcc
3.1 创建build文件夹
进入gcc源码文件夹,创建build文件夹并进入:mkdir build && cd build
需要说明,build 文件夹并不是必须创建,但为了将编译生成的中间文件与源码文件隔离开,若是编译失败至少不会打乱源码内容,不得已时也可直接删除 build 文件夹,因此一般都建议单独创建一个文件夹并在其中进行编译。
3.2 配置编译方式
配置编译方式:../configure --prefix=/opt/gcc-8.5.0 --enable-languages=c,c++ --disable-multilib
其中 --prefix 指定gcc安装位置,可以自定义,如上述命令将在/opt下创建gcc-8.5.0文件夹并安装于此处。
–enable-languages 指定gcc支持的语言
–disable-multilib 表示不生成交叉编译器(如果均在一种架构平台上编译并运行,如x86上,则无需交叉编译器)
3.3 使用make编译并安装
sudo make -j8 && sudo make install
其中 -j8 表示 8线程同时编译,可以根据机器配置自行设置。
4. 使用update-alternatives将其配置为默认gcc工具
update-alternatives 是通过软链接实现的一款非常方便地软件版本管理工具。
首先将 gcc-8.5.0 注册其中:
sudo update-alternatives --install /usr/bin/gcc gcc /opt/gcc-8.5.0/bin/gcc 100 --slave /usr/bin/g++ g++ /opt/gcc-8.5.0/bin/g++ --slave /usr/bin/gcov gcov /opt/gcc-8.5.0/bin/gcov
此时查看并配置 gcc 版本,update-alternatives --config gcc
,会显示如下:
There is only one alternative in link group gcc (providing /usr/bin/gcc): /opt/gcc-8.5.0/bin/gccNothing to configure.
即目前只注册了一个 gcc 版本,无需配置,再将系统本身的gcc注册其中(以gcc-11为例):
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 80 --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-11 --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-11 --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-11
再查看并配置 gcc 版本,sudo update-alternatives --config gcc
显示如下:
There are 2 choices for the alternative gcc (providing /usr/bin/gcc).Selection Path Priority Status
------------------------------------------------------------
* 0 /opt/gcc-8.5.0/bin/gcc 100 auto mode1 /opt/gcc-8.5.0/bin/gcc 100 manual mode2 /usr/bin/gcc-11 80 manual mode&#xfeff;Press <enter> to keep the current choice[*], or type selection number:
只需在终端交互中输入相应的序号即可切换 gcc版本。&#xff08;0是auto mode&#xff0c;会自动选择优先级最高的版本&#xff09;
>>> update-alternatives 基本命令参数使用
--install
用于注册某个软件
第一个参数表示注册到的位置&#xff0c;第二个参数表示在此管理工具下这个软件的名称&#xff0c;第三个参数表示优先级&#xff08;数字越大优先级越高&#xff09;&#xff0c;第四个参数表示软件的实际位置
--slave
用于设置和该软件依赖的其他软件&#xff0c;当改变软件版本时其依赖的软件版本也会相应改变
slave的参数与 install 基本一致&#xff0c;只是没有优先级设置的参数
--display
用于查看软件的各种版本、优先级和依赖
后接一个参数&#xff0c;指定软件名
--list
用于查看软件各版本的实际安装位置
后接一个参数&#xff0c;指定软件名