cd /usr/local/src // 进入用户自主操作目录
wget http://ftp.gnu.org/gnu/gcc/gcc-7.1.0/gcc-7.1.0.tar.bz2 // 下载安装包([安装包地址](http://ftp.gnu.org/gnu/gcc))
tar -jxvf gcc-7.1.0.tar.bz2 // 解压安装包
cd gcc-7.1.0
./contrib/download_prerequisites // 下载依赖库
mkdir gcc-temp // 建立编译输出目录
./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib // 生成makefile文件
make -j4 // 编译(j为核心数,速度会更快,这步极为耗时,建议睡前操作)
sudo make install // 安装
update-alternatives --install /usr/bin/gcc gcc /usr/local/bin/x86_64-pc-linux-gnu-gcc 40
// 倒数第三个是名字,倒数第二个参数为新GCC路径,最后一个参数40为优先级
mv /usr/bin/gcc /usr/bin/gcc.bak // 将原本的gcc重命名(删除亦可)
ln -s /usr/local/bin/x86_64-pc-linux-gnu-gcc /usr/bin/gcc
// 使用gcc7.1版本
升级完gcc升级后更新libstdc++.so.6动态库 不然安装swoole 找不到动态库
PHP message: PHP Warning: PHP Startup: Unable to load dynamic library 'swoole.so'
(tried: /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/swoole.so
(/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by
/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/swoole.so)),
/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/swoole.so.so
(/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/swoole.so.so: cannot open
shared object file: No such file or directory)) in Unknown on line 0
说明gcc已经是最新版本了,那么再确认下目前/usr/lib64目录下的libstdc++.so.6中包含动态库版本有哪些:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
发现确实没有3.4.21版本,那么很可能就是gcc升级后没有更新/usr/lib64下的libstdc++.so.6动态库,那么找下最新的libstdc++.so.6在哪里:
find / -name libstdc++.so.6
/usr/local/lib64/libstdc++.so.6
/home/gcc-6.1.0/gcc-temp/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
然后检查了一下/usr/local/lib64目录下的动态库:
发现这个里面正是最新版本的动态库,可见,在升级gcc时,gcc编译会在gcc-temp目录中生成libstdc++.so.6,升级完毕,默认只会在/usr/local/lib64目录下包含最新的libstdc++.so.6动态库,而不会更新/usr/lib64目录下的libstdc++.so.6。而执行程序时,程序会优先从/usr/lib64目录下去寻找libstdc++.so.6,由于老版本的gcc在/usr/lib64中有一个旧版本的动态库libstdc++.so.6,导致程序以为自己找到了正确的动态库,实际上找到的却不是最新的。
三、解决方案
用最新的libstdc++.so.6替换旧的/usr/lib64/libstdc++.so.6:cd /usr/lib64
rm -rf libstdc++.so.6
cp /usr/local/lib64/libstdc++.so.6 ./
strings /usr/local/lib64/libstdc++.so.6 | grep GLIBC