升级swoole遇到的坑--gcc--动态库

博客指出升级gcc后需更新libstdc++.so.6动态库,否则安装swoole会找不到动态库。经检查发现,升级gcc后,最新动态库在/usr/local/lib64目录,而程序优先从/usr/lib64找。解决方案是用最新的替换旧的/usr/lib64/libstdc++.so.6。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值