记录编译安装 GCC 11.2.0

本文最后更新于:2023年2月4日 晚上

尝试在 Ubuntu 20.04 上安装 VMware Workstation Pro 16.2.0,提示需要有 gcc 11.2.0(为 5.14.11 内核编译安装某些功能)。而从 Ubuntu 官方源 apt install 安装的最新版本只是 gcc 9,故查阅资料,尝试编译安装,记录过程如下。

Install GCC on Ubuntu 20.04

下载源码

GNU 官方下载地址:http://ftp.gnu.org/gnu/gcc/

1
2
wget http://ftp.gnu.org/gnu/gcc/gcc-11.2.0/gcc-11.2.0.tar.gz
tar -zxvf gcc-11.2.0.tar.gz

下载依赖及配置文件

1
2
3
sudo apt-get install bzip2 # 在我的机器上提示已经安装过了,保险起见还是再运行一下吧
cd gcc-11.2.0
sudo ./contrib/download_prerequisites

配置

1
2
3
4
5
6
7
mkdir build
cd build/
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
# –enable-languages 表示你要让你的gcc支持哪些语言
# –disable-multilib 不生成编译为其他平台可执行代码的交叉编译器
# –disable-checking 生成的编译器在编译过程中不做额外检查,
#也可以使用 *–enable-checking=xxx* 来增加一些检查

编译

1
sudo make -j 12 # 启用我机器的全部 12 线程

这一步耗时非常久,给笔电插上电源,耐心等待吧。

安装

1
sudo make install

验证安装

完成上面所有操作后,关闭当前终端,开一个新的终端(或重启电脑),运行 gcc -v

1
2
3
4
5
6
7
8
9
$ gcc -v
使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/11.2.0/lto-wrapper
目标:x86_64-pc-linux-gnu
配置为:../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
线程模型:posix
Supported LTO compression algorithms: zlib
gcc 版本 11.2.0 (GCC)

至此就完成 gcc 11.2.0 的编译安装了。

替换动态库

遇到问题

寒假里终于开始学习C++,编译完成第一个读文本文件的测试程序后,准备运行时却发生了报错。

1
./a.out: /lib/x86_64-linux-gnu/libstdc++.so.6: version 'GLIBCXX_3.4.29' not found (required by ./a.out)

在上一篇记录编译安装 GCC 11.2.0博客中通过源码编译升级了 GCC,看来是那时埋下的隐患。简单搜索之后便找到了下面的解决方案。

解决过程

分析问题

运行以下命令检查动态库:

1
strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

输出如下:

1
2
3
4
5
6
7
8
9
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
...
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_DEBUG_MESSAGE_LENGTH

的确没有 GLIBCXX_3.4.29,GCC 的动态库还是旧版本的,编译升级 GCC 时生成的新版本动态库没有替换老版本的。

解决问题

执行以下命令,查找编译 GCC 时生成的新动态库:

1
sudo find /usr/ -name "libstdc++.so*"

输出如下:

1
2
3
4
5
6
7
8
9
10
11
/usr/lib64/libstdc++.so.6.0.29
/usr/lib32/libstdc++.so.6
/usr/lib32/libstdc++.so.6.0.28
/usr/local/lib64/libstdc++.so
/usr/local/lib64/libstdc++.so.6.0.29
/usr/local/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so.6.0.29-gdb.py
...
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28
...

最新版本为 libstdc++.so.6.0.29,而 /usr/lib/x86_64-linux-gnu/ 路径下的版本为 6.0.28 ,这就是问题所在了。将新版本复制过去并重新链接即可。

1
2
3
4
5
sudo cp /usr/local/lib64/libstdc++.so.6.0.29 /lib/x86_64-linux-gnu/ # 复制新版本
cd /lib/x86_64-linux-gnu # 进入该目录
sudo rm ./libstdc++.so.6 # 删除原有的默认库的软链接
sudo mv libstdc++.so.6.0.28 ./libstdc++.so.6.0.28.backup # 保险起见,备份原文件
sudo ln -s ./libstdc++.so.6.0.29 libstdc++.so.6 # 建立新的软链接

至此,默认动态库升级完成。再次运行一下命令检查动态库:

1
strings /lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX

现在输出如下:

1
2
3
4
5
6
7
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
...
GLIBCXX_3.4.28
GLIBCXX_3.4.29
...

至此,问题就解决了,a.out 可以正常运行了。


记录编译安装 GCC 11.2.0
https://muzing.top/posts/16a16b69/
作者
Muzing
发布于
2021年12月3日
更新于
2023年2月4日
许可协议