目前在虚拟机中安装了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更新完成。