目前在虚拟机中安装了 Debian 12.7,使用apt安装的build-essential中默认的 GCC 版本是 12.2.0,如需安装 GCC13+ 版本可以使用源代码自行构建。
1 准备源代码
下载并解压源代码,这里选择更新到 13.3.0 版本。
1 | wget https://ftp.gnu.org/gnu/gcc/gcc-13.3.0/gcc-13.3.0.tar.gz |
2 安装依赖
首先确保使用apt安装了基本的编译环境。
1 | sudo apt update && sudo apt install -y build-essential libgmp-dev libmpfr-dev libmpc-dev gcc-multilib |
然后下载 GCC 13.3.0 编译过程中需要的依赖。
1 | cd gcc-13.3.0 |
3 编译安装
根据GCC 文档的说明,不能在代码所在目录gcc-13.3.0编译,应当创建一个和代码同级的目录生成 Makefile 文件,这里创建gcc-build目录。
1 | # 回到 gcc-13.3.0 所在的 home 目录后创建 gcc-build |
创建后的目录结构应为:
1 | . |
运行配置程序生成 Makefile,同样根据GCC 安装文档,这个步骤不要添加过多自己不清楚是干什么的参数。
1 | # 进入 gcc-build 目录后使用 configure 生成 Makefile |
3.1 编译
这个过程可能会非常慢,取决于硬件条件,使用虚拟机的话可以临时把 CPU 和内存都调到最大。我在虚拟机中编译,AMD R7-6800H 内核分配 16,内存分配 8G,编译时间大约 55 分钟。
1 | make -j$(nproc) |
编译过程中可能会出现错误,大多数情况是因为缺少依赖,根据报错信息搜索安装对应的依赖即可。编译中断后,可以在gcc-build目录中重复执行make -j$(nproc)命令,已经编译过的文件不会再次编译,幸运的话可以节省一些时间。
不过仍然建议出错中断后,删除gcc-build文件夹后彻底重新编译。
3.2 安装
这一步也会花费一些时间,但是比编译要快得多。在configure时没有指定--prefix参数,默认安装到了/usr/local/bin。向/usr/local/bin目录写入文件需要使用sudo。
1 | sudo make install |
3.3 添加动态库的路径
安装完成后会看到终端中有类似这样的提示:
1 | Libraries have been installed in: |
这是提示我们新的 GCC 的动态库安装在了/usr/local/lib/../lib64路径下,需要通过给出的方法中的至少一种,将这个路径添加到动态库搜索路径中。
可以选择修改环境变量的方式修改:
1 | export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/../lib64 |
将上面两条命令写入终端配置文件(如.bashrc、.zshrc等),可以实现永久配置。
也可以选择修改/etc/ld.so.conf配置文件,需要使用sudo,新加入的路径放在上面会优先于原来的路径查找:
1 | # 原文件 |
修改/etc/ld.so.conf配置文件后,需要使用sudo ldconfig命令刷新。
程序在使用新的 GCC 编译之后,运行时如果报错version GLIBCXX_X.X.X' not found,大概率是这一步设置没有做对。
使用ldd ./a.out查看编译出的可执行文件的动态库依赖关系,可以检测动态库搜索路径是否正确。
4 更新软连接
虽然已经编译安装完成,但使用gcc -v命令查看版本还没有更新,还需要修改gcc和g++命令的软连接,将其指向我们刚编译安装的/usr/local/bin/gcc和/usr/local/bin/g++。
如果经常需要切换版本,可以使用使用update-alternatives来管理不同的版本,这里简单起见,直接修改软连接。
查看旧版本的 GCC 所在的路径
1 | which gcc |
可以发现原本的gcc命令也是一个软连接,指向另一个软连接gcc-12,而gcc-12指向了真正的可执行文件x86_64-linux-gnu-gcc-12。g++命令也是一样。
现在删除原本的gcc和g++:
1 | sudo rm /usr/bin/gcc /usr/bin/g++ |
新建指向/usr/local/bin/gcc和/usr/local/bin/g++的gcc和g++:
1 | sudo ln -s /usr/local/bin/gcc /usr/bin/gcc |
此时就可以使用gcc -v验证更新后的版本了。
5 删除文件
使用新的 GCC 编译一个程序,并且该程序能正常运行。简单测试一下安装正常之后,可以删除 GCC 编译后产生的文件,位于目录gcc-build;GCC 代码文件,位于目录gcc-13.3.0;GCC 代码压缩包gcc-13.3.0.tar.gz。
1 | rm -rf gcc-build gcc-13.3.0 gcc-13.3.0.tar.gz |
至此 GCC 更新完成。