尝试在 Ubuntu 20.04 上安装 VMware Workstation Pro 16.2.0,提示需要有 gcc 11.2.0(为 5.14.11 内核编译安装某些功能)。而从 Ubuntu 官方源 apt install 安装的最新版本只是 gcc 9,故查阅资料,尝试编译安装,记录过程如下。
下载源码
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
|
编译
这一步耗时非常久,给笔电插上电源,耐心等待吧。
安装
验证安装
完成上面所有操作后,关闭当前终端,开一个新的终端(或重启电脑),运行 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
可以正常运行了。