CentOS7升级GCC版本
解决 version `GLIBCXX_3.4.20` not found 问题

1. 问题出现

起因是在白嫖的OracleCloud主机上,准备运行Hugo编译网站,结果从Hugo Github官网下载的Linux二进制文件在直接执行的时候出错。

../hugo
../hugo: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by ../hugo)
../hugo: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by ../hugo)
../hugo: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ../hugo)

看错误是操作系统OraclLinux7(完全兼容CentOS7)自带的Glib库版本太低,查看一下。

ll /lib64/libstdc++*
lrwxrwxrwx. 1 root root       19 Jun 15  2021 /lib64/libstdc++.so.6 -> libstdc++.so.6.0.19
-rwxr-xr-x. 1 root root   995840 Jul 20  2020 /lib64/libstdc++.so.6.0.19

果然,自带的版本只到libstdc++.so.6.0.19。

再看下现在系统已安装的GCC版本

gcc -v
……
gcc version 4.8.5

系统才4.8.5,看来是需要升级GCC了。

解决方法有有两个,一是下载源码编译出6.0.21的so库;二是直接拷贝一个编译号的so库文件。


2. 源码编译GCC

查了一下需要的GLIBCXX_3.4.21在GCC 5.4版本就已经包含,安装更高版本的GCC编译时会更多时间和占用更多空间,所以本着够用就行的原则,我们下载安装5.4.0版本的GCC。

GNU GCC官网找到FTP下载地址,翻到5.4.0版本的链接,开搞。

备用地址

2.1 安装基础包

先yum安装一些基础包,不然后面很多check过不了。

yum install -y gcc automake autoconf libtool make gcc-c++ zlib-devel

2.2 下载源码

wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-5.4.0/gcc-5.4.0.tar.bz2
tar -xvf gcc-5.4.0.tar.bz2

2.3 安装prerequisites

cd gcc-5.4.0
./contrib/download_prerequisites

如果下载不顺利,可以用下面的手动安装prerequisites

yum -y install gmp-devel mpfr-devel libmpc-devel
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.15.tar.bz2   // 编译依赖此库
tar -jxvf isl-0.15.tar.bz2  
cd isl-0.15  
./configure   
make  
make install

2.4 开始源码编译

完成安装prerequisites后,开始正式编译。

mkdir build
cd build
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j4
make install

make那一步要非常久,我的白嫖主机编译了1个小时还没完,我锁屏下班让它继续编译,具体多久完成的已经不知道了。

2.5 更新GCC路径

安装完成,hugo还是不能运行。gcc -v居然还是显示4.8.5版本。应该是新安装的gcc没有链接或不在默认PATH里。 查看一下哪些地方有gcc

whereis gcc

有好几个,新的GCC应该安装在/usr/local/bin/gcc

/usr/local/bin/gcc -v
gcc version 5.4.0 (GCC

验证正确,把在PATH里加上/usr/local/bin/

echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

再次测试gcc -v

/usr/local/bin/gcc -v
gcc version 5.4.0 (GCC

OK了,但是hugo命令还是报错/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20’ not found

用ll /lib64/libstdc++*查看so库文件还是链接到6.0.19的

2.6 更新libstdc++.so软链接

找到新文件libstdc++.so.6.0.21拷过去,删除19版本的旧软链接,创建21版本的新软链接。

cp /usr/local/lib64/libstdc++.so.6.0.21 /lib64/
ll /lib64/libstdc++*
lrwxrwxrwx. 1 root root       19 Jun 15  2021 /lib64/libstdc++.so.6 -> libstdc++.so.6.0.19
-rwxr-xr-x. 1 root root   995840 Jul 20  2020 /lib64/libstdc++.so.6.0.19
-rwxr-xr-x. 1 root root 11064720 Oct 27 01:40 /lib64/libstdc++.so.6.0.21

rm /lib64/libstdc++.so.6
ln -s /lib64/libstdc++.so.6.0.21 /lib64/libstdc++.so.6 

确认下是不是正确

ll /lib64/libstdc++*
lrwxrwxrwx. 1 root root       19 Jun 15  2021 /lib64/libstdc++.so.6 -> libstdc++.so.6.0.21
-rwxr-xr-x. 1 root root   995840 Jul 20  2020 /lib64/libstdc++.so.6.0.19
-rwxr-xr-x. 1 root root 11064720 Oct 27 01:40 /lib64/libstdc++.so.6.0.21

完结撒花,Hugo运行正常。

3. 下载libstdc++.so.6.0.21二进制文件

不想编译的同学,正好系统也是兼容CentOS7的话,可以直接下载我编译好的so文件,libstdc++.so.6.0.21下载链接(2M),然后安装上面最后一步2.6章节拷过去建立软链接就OK了。


Last modified on 2023-10-30