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