如何在 CentOS 上编译安装最新版 GCC

GNU 编译器套装(GNU Compiler Collection,GCC)是由 GNU 项目(GNU Project)出品的一款优化编译器。该套装包含了 C、C++、Objective-C、Fortran、Ada、Go、以及 D 的前端和软件库(如 libstdc++ 等)。

在 CenOS 上可以通过 yumdnf 命令很方便地安装 GCC,但是版本可能较低,某些情况下无法满足需求,因此我们需要自行编译安装特定版本的 GCC 以满足我们在某些情况下的特定需求。

GCC 官方文档提供了较为详细的安装指南,如果你想要了解配置和构建 GCC 的细节,可参考其文档中的”Installing GCC“(安装 GCC)部分。本文以 GCC 最新版本 13.2.0 为例,带你快速了解在 CentOS 上构建 GCC 的流程,以及如何让多个版本共存。本文提供的安装步骤已在 CentOS 7、以及 CentOS Stream 8/9 中测试。

遵循“最小权限原则”(Principle of least privilege)是一种最佳实践,因此本文假设你登录的是不具备管理员账户(root)权限普通账户。文中出现的命令大部分不会用到 root 权限,仅会在有必要时在相关命令前添加 sudo 命令调用 root 权限。

本文在用到包管理器时,会统一使用 yum 命令,但是要知道在 CenOS 8、CentOS Stream 8 及更新版本的 CentOS 中,yum 命令已被 dnf 命令替代(以符号链接的形式存在),运行 yum 命令实际上是运行 dnf 命令。

一、准备工作

构建 GCC 需要多种工具和软件包。具体可参考“Prerequisites for GCC”(GCC 先决条件)。对于 CentOS 来说,需要确保安装了相关的工具及软件库依赖。你可以运行以下命令以确保它们的安装:

sudo yum install -y gcc gcc-c++ glibc-devel.i686 libmpc-devel

由于 GCC 自身是由 C 语言编写的,因此你需要一个 C 语言编译器来构建它,通常可以用旧版本的 GCC 编译高版本的 GCC。因此,需要通过 CentOS 中的 yum 命令安装一个旧版本的 GCC。

另外,这里有意安装了 glibc-devel.i686 这个软件库依赖,目的是为了让构建的 GCC 能够编译 32 位程序。如果你不需要编译 32 位程序也可不安装,但是在配置 GCC 构建时需要使用选项 --disable-multilib 禁用对多目标软件库(用于支持不同的目标架构变体、调用约定等)的构建。

准备工作完成后,就可以开始开始构建 GCC 的具体步骤了。

二、获取源码

GCC 提供了两种源代码获取方式,一种是从 GNU 官方站点及其镜像站点直接下载源代码压缩包,另一种是通过 GNU 提供的 Git 仓库克隆源代码。你可以根据自己喜好选择不同的方式。为方便介绍,本文示例采用的是第一种方式。

要通过 GNU 官方或镜像站点下载 GCC 源代码,可访问下列网址:

本文示例通过官方站点下载。可以运行以下命令直接将 GCC 源代码压缩包下载到本地(你可以自行选择合适的位置):

curl -O https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.gz

下载到的压缩包文件名应为 gcc-13.2.0.tar.gz(文件名中的版本号是你所选择的版本)。运行以下命令将下载后压缩包文件解压缩,得到文件夹 gcc-13.2.0 备用:

tar -xvf gcc-13.2.0.tar.gz

如果你想要通过 Git 仓库下载 GCC 源代码,可以运行以下命令:

git clone git://gcc.gnu.org/git/gcc.git gcc

如果你想使用特定版本,可以进入 gcc 目录,通过命令 git tag --list 查看 GCC 所有版本,并用命令 git checkout tagname 将源码切换到你想要的版本(注意将这里的 tagname 换成实际的标签名)。当然,你也可以通过切换分支来切换版本,具体可参考官方相关文档的相关说明。

此外 GCC 还提供了其他下载方式,如 FTP 和 Rsync,如果有需要可访问“GNU Mirror List”(GNU 镜像列表)页面获取。注意,此页面中提供的站点或镜像站点包含 GNU 项目的全部软件资源,你需要在其中的 gcc 文件夹中获取 GCC 源代码。

三、配置定制

在开始构建 GCC 之前,你可以根据自己的需要对待构建的 GCC 源代码进行配置。GCC 提供了丰富的配置选项,具体可查阅“Installing GCC: Configuration”(安装 GCC:配置)。在本文示例中,由于没有特殊需要,仅使用了其中一个选项,这会在下面的步骤中提及。

尽管你可以直接在源代码所在目录中构建 GCC,但是官方文档强烈建议在独立于源代码所在目录的目录中构建。比如你想要在名为 objdir 的文件夹中构建 GCC,那么该文件夹应和源代码夹在同一层级:

.
├── gcc-13.2.0
└── objdir

也就是说,你不应直接在源代码目录中构建,也不应该在源代码中创建子文件夹并在该文件夹中构建。

当前你应在 GCC 源代码文件夹 gcc-13.2.0 所在的目录下。逐一运行以下命令(先创建名为 objdir 的文件夹,再将工作目录切换到该文件夹,最后运行 configure 脚本执行配置):

mkdir objdir
cd objdir
./gcc-13.2.0/configure --prefix=/usr/local/gcc

这里使用了一个配置选项,即 --prefix,用来指定所构建 GCC 的安装的路径,本文示例的安装路径为 /usr/local/gcc,你也可以根据自己的需要选择合适的路径。

四、开始构建

配置完成后就可以开始正式构建 GCC 了,运行以下命令开始构建 GCC:

make -j2

构建时间的长短取决于你所用机器的性能。如果你使用的机器性能强劲,可适当加大选项 -j 的值增加任务的并行数量以加快构建速度。

如果有需要,你可以对已构建的 GCC 进行测试,这需要安装相关工具,具体可参考官方文档中的“Installing GCC: Testing”。本文示例忽略了测试步骤,直接运行以下命令进行安装:

sudo make install

构建并安装成功后,GCC 会存放在目录 /usr/local/gcc 中。

五、切换版本

现在你的系统中的 GCC 存在两个版本,一个是为了构建新版本 GCC 通过 yum 命令安装的旧版本 GCC,另一个是刚刚构建好的新版本 GCC。

如果你只需要偶尔使用新版本 GCC,可以在使用前在 Shell 中运行下列命令临时修改相关的系统环境变量,以便在通过源代码构建其他程序时能够正确调用新安装的 GCC:

export CC=/usr/local/gcc/bin/gcc
export CXX=/usr/local/gcc/bin/g++
export LD_LIBRARY_PATH="/usr/local/gcc/lib64:$LD_LIBRARY_PATH"
export PATH="/usr/local/gcc/bin:$PATH"

如果新版本 GCC 需要成为你的主力编译器,可以编辑 Bash 的配置文件 .bashrc.bash_profile 文件,将上面这些命令添加进去。

以 .bash_profile 为例,使用你喜欢的编辑器(这里使用的是 vi 编辑器)将其打开:

vi ~/.bashrc

将光标移动到内容末尾(.bashrc 通常在注释 #User specific aliases and functions 后面一行,.bash_proxy 通常在注释 #User specific environment and startup programs 后面一行),然后将之前的那些命令输入或复制粘贴到该文件中,保存退出(vi 编辑器先按 ESC 再输入 :wq 并回车)。

最后运行以下命令使其生效即可正常使用 GCC:

source ~/.bash_profile

六、升级版本

如果想要升级到 GCC 今后发布的新版本,只需按照以上步骤重新操作一遍即可。

2条评论

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注