Lolipop's Studio.

Linux 容器更新或降级 GCC 版本

字数统计: 1.3k阅读时长: 5 min
2021/04/20

如果软件源可用,可以使用 CentOS 的 yum 包管理器或 Ubuntu 的 apt 包管理器等一键安装 GCC,例如:

1
2
3
4
5
yum -y install gcc
yum -y install gcc-c++

# 或是一键安装开发工具软件包,包括 gcc, g++ 等
yum groupinstall "Development Tools"

本文适用于系统中包含有其它版本的 GCC 编译器情况下,手动更新或降级 GCC 编译器。编译 GCC 的过程十分耗时,如果能使用包管理器尽量还是使用包管理器吧。

NOTE: 如果仅使用 GCC 进行编译操作或不确定当前系统能否兼容新版本的 GCC,建议在 Docker 容器环境中执行编译和安装操作,并在容器中使用 GCC 编译器进行编译源码。

1
2
# 查看当前系统中 GCC 的版本
gcc -v

下载 GCC 并解压

GCC 官网选择下载 GCC 的镜像站点,选择进入 release/ 目录,选择需要的 GCC 版本下载即可。

本文以安装 GCC 10.3.0 为例,进入 release/gcc-10.3.0/ 目录,选择 gcc-10.3.0.tar.gz 进行下载。

将压缩包传入 Docker 容器环境,并解压到容器的 /usr/local/ 目录下。

1
tar -xf gcc-10.3.0.tar.gz -C /usr/local/

下载 GCC 依赖包

执行以下命令,下载 GCC 编译所需的依赖包:

1
2
3
cd /usr/local/gcc-10.3.0
# 执行脚本下载依赖包
./contrib/download_prerequisites

对于较老版本的 GCC(例如 4.9.4 版本),执行脚本时可能会无法连接服务器,可以更换代理进行下载:

1
2
# 编辑 contrib/download_prerequisites 文件
vim ./contrib/download_prerequisites

将文件中 ftp://gcc.gnu.org/pub/gcc/infrastructure 字段更换为 http://www.mirrorservice.org/sites/sourceware.org/pub/gcc/infrastructure,然后再在根目录执行 ./contrib/download_prerequisites 命令下载依赖包即可。

对于较新版本的 GCC(例如 10.3.0 版本),依赖包包括 gmp, mpfr, mpc 以及 isl。提示如下,表示依赖下载成功:

1
2
3
4
5
6
7
8
9
2021-04-19 15:32:27 URL:http://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2 [2383840/2383840] -> "./gmp-6.1.0.tar.bz2" [1]
2021-04-19 15:32:30 URL:http://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2 [1279284/1279284] -> "./mpfr-3.1.4.tar.bz2" [1]
2021-04-19 15:32:34 URL:http://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz [669925/669925] -> "./mpc-1.0.3.tar.gz" [1]
2021-04-19 15:32:38 URL:http://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2 [1658291/1658291] -> "./isl-0.18.tar.bz2" [1]
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.

编译 GCC

回到上一级目录即 /usr/local,手动创建一个目录,存放编译 GCC 源码生成的文件:

1
2
3
cd /usr/local
mkdir gcc-build-10.3.0
cd gcc-build-10.3.0

现在我们在 /usr/local/ 路径下创建了一个名为 gcc-build-10.3.0 的目录,并进入到此目录中。

GCC 编译器支持多种编程语言的编译,但我们一般使用它来编译 C 和 C++ 语言程序的源码。因此在编译 GCC 之前可以配置只启用 C 和 C++ 语言支持。这一步为可选操作:

1
/usr/local/gcc-10.3.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

如果不需要禁用多语言编译支持,则直接运行 configure 即可:

1
/usr/local/gcc-10.3.0/configure

执行完成后,会在当前路径创建 Makefile 文件,执行 make 命令编译 GCC 源程序即可。

编译过程会占用很大的空间,请确保当前目录的空间足够使用。

考虑到单作业执行编译操作十分之慢(参考文档的作者在他的机器上花费了 6 小时才完成编译),可以设置 -j 选项执行并行作业,选项后边的数字建议为 CPU 内核数量的 1.5 倍甚至 2 倍。如下述命令同时启用 8 个作业并行编译 GCC:

1
make -j 8

现在,忘记这边的事情,去做一些其它的事儿吧!


Tue Apr 20 9:52 CST 2021 - Tue Apr 20 12:33:29 CST 2021.

好久不见!我的机器在 8 个作业并行编译的情况下,大约花费了 2.5 小时完成了编译。

现在执行下述命令安装 GCC 即可:

1
make install

此时直接执行 gcc -v 仍会显示以前安装的版本,在重启系统之后就会显示为当前安装的版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 重启容器环境
docker restart ${CONTAINER}

# 检查安装是否成功
gcc -v

# 显示如下内容表示安装成功
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/10.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /usr/local/gcc-10.3.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.3.0 (GCC)

文末碎碎念

我没有在 Docker 容器环境里执行 make install 操作,接着直接重启了当前主机,导致主机出现问题没法登陆。

一般建议编译和安装操作都在 Docker 容器环境里进行,不要直接操作宿主机环境!

参考文档

CATALOG
  1. 1. 下载 GCC 并解压
  2. 2. 下载 GCC 依赖包
  3. 3. 编译 GCC
  4. 4. 文末碎碎念
  5. 5. 参考文档