如果软件源可用,可以使用 CentOS 的 yum 包管理器或 Ubuntu 的 apt 包管理器等一键安装 GCC,例如:
1 | yum -y install gcc |
本文适用于系统中包含有其它版本的 GCC 编译器情况下,手动更新或降级 GCC 编译器。编译 GCC 的过程十分耗时,如果能使用包管理器尽量还是使用包管理器吧。
NOTE: 如果仅使用 GCC 进行编译操作或不确定当前系统能否兼容新版本的 GCC,建议在 Docker 容器环境中执行编译和安装操作,并在容器中使用 GCC 编译器进行编译源码。
1 | # 查看当前系统中 GCC 的版本 |
下载 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 | cd /usr/local/gcc-10.3.0 |
对于较老版本的 GCC(例如 4.9.4
版本),执行脚本时可能会无法连接服务器,可以更换代理进行下载:
1 | # 编辑 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 | 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] |
编译 GCC
回到上一级目录即 /usr/local
,手动创建一个目录,存放编译 GCC 源码生成的文件:
1 | cd /usr/local |
现在我们在 /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 | # 重启容器环境 |
文末碎碎念
我没有在 Docker 容器环境里执行 make install
操作,接着直接重启了当前主机,导致主机出现问题没法登陆。
一般建议编译和安装操作都在 Docker 容器环境里进行,不要直接操作宿主机环境!