前言
前段时间一直利用课余时间在协助一家公司做一些产品的测试工作。由于项目的特殊性,需要用到一些最新的特性,而现有 apt 源中的 GCC 版本过低;即便添加 apt PPA 源可以解决一部分问题,还要折腾网络环境(众所周知的一些问题)。所以我决定自己编译安装一个最新的 GCC 版本,方便以后直接复用。
概述
本文介绍如何在 Debian/Ubuntu 系统上编译安装 GCC 13.2.0,整体流程如下:
什么是 GCC?
GCC 是 GNU Compiler Collection 的缩写,是由 GNU 开发的编译器集合,支持 C、C++、Objective-C、Fortran、Go 等多种编程语言。
说白了,GCC 就是一个编译器,它可以把源代码编译成可执行文件,然后直接在目标系统上运行。
准备工作
环境需求
- Debian 12 或 Ubuntu 22.04 LTS 系统(强烈推荐这两个版本),或者其他基于 Debian 的系统,甚至 Alpine(也许?)。
- 一个可以访问外网的网络环境。如果你不理解我在说什么,可以用任意方法,只要能顺利且快速地用 Git 获取 GCC 源码即可,这里推荐 清华大学 TUNA 镜像站。
- 已有 gcc/g++(编译 GCC 本身需要一个现成的 C/C++ 编译器),没有的话先安装:
sudo apt install build-essential。 - 预留足够的磁盘空间(源码加编译产物大约需要 10 GB 以上)和时间。
智慧或灵活的脑子。
安装编译依赖
| |
原文这里还装了
libcloog-isl-dev,这个包在较新的 Debian/Ubuntu 中已经不存在了,GCC 5 之后也不再需要 CLooG,直接去掉即可。
下载/克隆 GCC 源码
| |
对于中国大陆用户,可以使用 清华大学开源软件镜像站 下载 GCC 源码:
| |
编译安装
下载依赖
| |
这个脚本会下载 GMP、MPFR、MPC、ISL 的源码,并在 gcc-src 下建好软链接,之后会和 GCC 一起编译。
如果你在中国大陆,执行 ./contrib/download_prerequisites 时可能会遇到下载不了的问题。这时可以手动下载对应的压缩包放到 gcc-src 目录下,再执行一次这个脚本,它会自动检测并跳过已下载的文件。或者像我一样,用 proxychains 这个工具代理下载(强烈推荐)。
像我这样就是下载成功的:

配置
GCC 官方文档强烈建议在源码目录之外单独建一个构建目录,不要直接在源码目录里 ./configure,否则可能遇到各种奇怪的问题:
| |
--prefix:安装到独立目录,不会覆盖系统自带的 GCC,想卸载直接删掉这个目录即可;--enable-languages=c,c++:只编译 C 和 C++,能省下不少时间;--disable-multilib:不编译 32 位支持库,省得再去装 32 位的依赖。
编译
| |
2>&1 把错误输出也一起记进 build.log,出错时方便翻日志。完整编译耗时较长(视机器性能从几十分钟到几个小时不等),耐心等待即可。
安装
| |
验证
| |
(可选)打包成 deb
如果想把编好的 GCC 复制到其他机器上,或者想让 apt/dpkg 来管理卸载,可以先安装到一个临时目录,再用 dpkg-deb 打包。在 gcc-build 目录中执行:
| |
DESTDIR会让所有文件装到$HOME/gcc-pkg/usr/local/gcc-13.2.0/下,不需要sudo;Architecture按实际情况填写,可以用dpkg --print-architecture查看;- 在其他机器上用
sudo apt install ./gcc-13.2.0-local_amd64.deb安装(目标机器需要是相同架构、相近版本的系统),卸载用sudo apt remove gcc-13.2.0-local。
配置环境变量
我使用
zsh作为我的 shell,所以在~/.zshrc中添加环境变量。如果你使用的是bash或者其他 shell,请自行修改对应的配置文件。
| |
注意新路径要放在 $PATH 的前面。shell 是按 PATH 从左到右查找命令的,如果写成 $PATH:/usr/local/gcc-13.2.0/bin,会先找到系统自带的 /usr/bin/gcc,新装的 GCC 根本用不上:
LD_LIBRARY_PATH 那一行是为了让用新 GCC 编译出来的 C++ 程序在运行时能找到新版的 libstdc++.so,否则可能报 version `GLIBCXX_3.4.32' not found 之类的错误。
验证环境变量
| |
which gcc 输出 /usr/local/gcc-13.2.0/bin/gcc,并且版本号是 13.2.0,就说明大功告成了。