升級swoole遇到的坑--gcc--動態庫

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章