Centos/redhat下GLIBCXX_3.4.20的问题

编译一些软件的时候会出现类似如下问题:

rror: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found 
undefined reference to `std::__cxx11::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::_M_sync(char*, unsigned long, unsigned long)@GLIBCXX_3.4.21'

原因是libstdc++.so.6里面没有这个GLIBCXX_3.4.20/GLIBCXX_3.4.21版本,可以通过如下命令查看

# find / -name libstdc++.so.6
/usr/lib64/libstdc++.so.6
# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
...
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH

看有人通过升级gcc可以获得新版本的库,从而包含需要的GLIBCXX_3.4.*,我通过yum install devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils 升级了gcc/c++到7.3,库依然不变(难道需要先删除系统自带的gcc 4.x,然后再安装?)

目前测试有效的方法,手动编译安装gcc-7.2 gcc-7.5 (gcc-7.2会有文章最下面说的安全问题,所以换成gcc-7.5),把libstdc++.so.6对应的库copy到/usr/lib64下面,

wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-7.2.0/gcc-7.2.0.tar.gz
tar xvzf gcc-7.2.0.tar.gz
cd gcc-7.2.0
./contrib/download_prerequisites

mkdir  gcc-build
cd   gcc-build
../configure --prefix=/usr/local/gcc-7.2.0 --enable-threads=posix --disable-checking --disable-multilib --enable-languages=c,c++

make //时间非常久,应该试一下make -j 16并行编译
make install 

安装在/usr/local/gcc-7.2.0目录下,可以看到libstdc++.so.6里面已经有了需要的GLIBCXX_3.4.20/GLIBCXX_3.4.21版本

$ strings /usr/local/gcc-7.2.0/lib64/libstdc++.so.6 | grep GLIBCXX_
...
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
...

修改环境变量,使得gcc-7.2.0为默认的gcc

vim /etc/profile
添加如下:
export PATH=/usr/local/gcc-7.2.0/bin${PATH:+:${PATH}}
export MANPATH=/usr/local/gcc-7.2.0/share/man:${MANPATH}
export INFOPATH=/usr/local/gcc-7.2.0/share/info${INFOPATH:+:${INFOPATH}}
export LD_LIBRARY_PATH=/usr/local/gcc-7.2.0/libexec/gcc/x86_64-pc-linux-gnu/7.2.0:/usr/local/gcc-7.2.0/lib64:/usr/local/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0/plugin${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
使其生效:
. /etc/profile

$ gcc -v
gcc version 7.2.0 (GCC) 

copy 新的libstdc++.so.6到/usr/lib64

$ ls -l /usr/local/gcc-7.2.0/lib64/libstdc++.*
lrwxrwxrwx 1 root root       19 Aug 13 09:46 /usr/local/gcc-7.2.0/lib64/libstdc++.so -> libstdc++.so.6.0.24
lrwxrwxrwx 1 root root       19 Aug 13 09:46 /usr/local/gcc-7.2.0/lib64/libstdc++.so.6 -> libstdc++.so.6.0.24
-rwxr-xr-x 1 root root 11503064 Aug 13 09:46 /usr/local/gcc-7.2.0/lib64/libstdc++.so.6.0.24

$ ls -l /usr/lib64/libstdc++.*
lrwxrwxrwx. 1 root root     19 Jun 11 11:24 /usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.19
-rwxr-xr-x. 1 root root 991616 Aug  7  2019 /usr/lib64/libstdc++.so.6.0.19

$ sudo cp /usr/local/gcc-7.2.0/lib64/libstdc++.so.6.0.24 /usr/lib64/
$ cd /usr/lib64/
$ sudo rm /usr/lib64/libstdc++.so.6
$ sudo ln -s libstdc++.so.6.0.24 libstdc++.so.6

这样就设置好了,可以正常使用了。

-------

存在的问题:

后来发现使用这个gcc编译kernel时,会报错building kernel with non-retpoline compiler

stackoverflow上的解释是为了避免漏洞,需要新版本的gcc。(解释),看来需要去https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/下载个更新的gcc

 

参考:

https://www.booolen.com/post/20190403_centos%E4%B8%8Bglibcxx_3.4.20%E7%9A%84%E9%97%AE%E9%A2%98/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值