Featured image of post 编译安装 GCC 13.2

编译安装 GCC 13.2

- Debian/Ubuntu 系统编译安装 GCC 13.2.0

前言

前段时间一直利用课余时间在协助一家公司做一些产品的测试工作。由于项目的特殊性,需要用到一些最新的特性,而现有 apt 源中的 GCC 版本过低;即便添加 apt PPA 源可以解决一部分问题,还要折腾网络环境(众所周知的一些问题)。所以我决定自己编译安装一个最新的 GCC 版本,方便以后直接复用。

概述

本文介绍如何在 Debian/Ubuntu 系统上编译安装 GCC 13.2.0,整体流程如下:

编译安装 GCC 的整体流程

什么是 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 以上)和时间。
  • 智慧或灵活的脑子。

安装编译依赖

1
2
3
4
5
sudo apt update
sudo apt install -y build-essential flex bison
sudo apt install -y libgmp-dev libmpfr-dev libmpc-dev
sudo apt install -y libisl-dev
sudo apt install -y libssl-dev

原文这里还装了 libcloog-isl-dev,这个包在较新的 Debian/Ubuntu 中已经不存在了,GCC 5 之后也不再需要 CLooG,直接去掉即可。

下载/克隆 GCC 源码

1
git clone -b releases/gcc-13.2.0 --depth=1 https://gcc.gnu.org/git/gcc.git gcc-src

对于中国大陆用户,可以使用 清华大学开源软件镜像站 下载 GCC 源码:

1
git clone -b releases/gcc-13.2.0 --depth=1 https://mirrors.tuna.tsinghua.edu.cn/git/gcc.git gcc-src

编译安装

下载依赖

1
2
cd gcc-src
./contrib/download_prerequisites

这个脚本会下载 GMP、MPFR、MPC、ISL 的源码,并在 gcc-src 下建好软链接,之后会和 GCC 一起编译。

如果你在中国大陆,执行 ./contrib/download_prerequisites 时可能会遇到下载不了的问题。这时可以手动下载对应的压缩包放到 gcc-src 目录下,再执行一次这个脚本,它会自动检测并跳过已下载的文件。或者像我一样,用 proxychains 这个工具代理下载(强烈推荐)。

像我这样就是下载成功的:

下载依赖完毕

配置

GCC 官方文档强烈建议在源码目录之外单独建一个构建目录,不要直接在源码目录里 ./configure,否则可能遇到各种奇怪的问题:

1
2
mkdir ../gcc-build && cd ../gcc-build
../gcc-src/configure --prefix=/usr/local/gcc-13.2.0 --enable-languages=c,c++ --disable-multilib
  • --prefix:安装到独立目录,不会覆盖系统自带的 GCC,想卸载直接删掉这个目录即可;
  • --enable-languages=c,c++:只编译 C 和 C++,能省下不少时间;
  • --disable-multilib:不编译 32 位支持库,省得再去装 32 位的依赖。

编译

1
make -j$(nproc) 2>&1 | tee build.log

2>&1 把错误输出也一起记进 build.log,出错时方便翻日志。完整编译耗时较长(视机器性能从几十分钟到几个小时不等),耐心等待即可。

安装

1
sudo make install

验证

1
/usr/local/gcc-13.2.0/bin/gcc --version

(可选)打包成 deb

如果想把编好的 GCC 复制到其他机器上,或者想让 apt/dpkg 来管理卸载,可以先安装到一个临时目录,再用 dpkg-deb 打包。在 gcc-build 目录中执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
make install DESTDIR=$HOME/gcc-pkg
mkdir -p $HOME/gcc-pkg/DEBIAN
cat > $HOME/gcc-pkg/DEBIAN/control <<'EOF'
Package: gcc-13.2.0-local
Version: 13.2.0-1
Architecture: amd64
Maintainer: yourname <you@example.com>
Description: GCC 13.2.0 installed in /usr/local/gcc-13.2.0
EOF
dpkg-deb --build --root-owner-group $HOME/gcc-pkg gcc-13.2.0-local_amd64.deb
  • 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,请自行修改对应的配置文件。

1
2
3
echo 'export PATH="/usr/local/gcc-13.2.0/bin:$PATH"' >> ~/.zshrc
echo 'export LD_LIBRARY_PATH="/usr/local/gcc-13.2.0/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"' >> ~/.zshrc
source ~/.zshrc

注意新路径要放在 $PATH 的前面。shell 是按 PATH 从左到右查找命令的,如果写成 $PATH:/usr/local/gcc-13.2.0/bin,会先找到系统自带的 /usr/bin/gcc,新装的 GCC 根本用不上:

PATH 顺序决定用的是哪个 gcc

LD_LIBRARY_PATH 那一行是为了让用新 GCC 编译出来的 C++ 程序在运行时能找到新版的 libstdc++.so,否则可能报 version `GLIBCXX_3.4.32' not found 之类的错误。

验证环境变量

1
2
which gcc
gcc --version

which gcc 输出 /usr/local/gcc-13.2.0/bin/gcc,并且版本号是 13.2.0,就说明大功告成了。

参考

由 Hugo 强力驱动