记录编译安装 GCC 11.2.0

本文最后更新于 2023年2月5日 早上

尝试在 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月5日
许可协议