编译一些软件的时候会出现类似如下问题:
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/