当前位置: 首页 > 工具软件 > GCC > 使用案例 >

gcc特定版本Linux源码编译安装 (以gcc-8.5.0为例)

岳杜吟
2023-12-01

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源码文件夹之下(建议版本相同),这里提供两种下载方式:

  1. 访问 gnu 镜像地址,依次进入相应文件夹,选择对应版本下载,如访问 清华镜像地址 ,进入gmp文件夹,选择gmp-6.1.0.tar.bz2下载
  2. 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 解压并生成软链接:

  1. 进入gcc源码文件夹,执行tar -vxf gmp-6.1.0.tar.bz2 解压,生成文件夹 gmp-6.1.0
  2. 执行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/gcc

Nothing 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 mode
  1            /opt/gcc-8.5.0/bin/gcc   100       manual mode
  2            /usr/bin/gcc-11          80        manual mode

Press <enter> to keep the current choice[*], or type selection number:

只需在终端交互中输入相应的序号即可切换 gcc版本。(0是auto mode,会自动选择优先级最高的版本)


>>> update-alternatives 基本命令参数使用
--install 用于注册某个软件
  第一个参数表示注册到的位置,第二个参数表示在此管理工具下这个软件的名称,第三个参数表示优先级(数字越大优先级越高),第四个参数表示软件的实际位置
--slave 用于设置和该软件依赖的其他软件,当改变软件版本时其依赖的软件版本也会相应改变
  slave的参数与 install 基本一致,只是没有优先级设置的参数
--display 用于查看软件的各种版本、优先级和依赖
  后接一个参数,指定软件名
--list 用于查看软件各版本的实际安装位置
  后接一个参数,指定软件名

 类似资料: