類似/usr/lib 64/libstdc++を解決する.so.6: version `GLIBCXX_3.4.21'not foundの問題

3290 ワード

ソースコードのコンパイルアップグレードにgccがインストールされた後、プログラムをコンパイルしたり、他のプログラムを実行したりすると、/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not foundのような問題が発生することがあります.これは、gccをアップグレードすると、生成されたダイナミックライブラリが古いバージョンgccのダイナミックライブラリを置き換えていないため、gccの最新バージョンのダイナミックライブラリをシステムの古いバージョンのダイナミックライブラリに置き換えることで解決できるからです.
1.問題原因分析
最新バージョンのNode.js(最新バージョンのNode.jsではC++ 11が使用されているが、C++ 11ではcode>gcc 4.8+がサポートされる必要がある)をインストールするために、gccを現在の最新バージョンのv 5.2.0にアップグレードした.アップグレード後、新しいバージョンのNode.js(v 4.2.1)のコンパイルに成功してインストールされたが、ランタイムプログラムでは以下のエラーが発生した.
node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)
node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by node)
node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)

次のコマンドを実行して、ダイナミックライブラリを確認します.
strings /usr/lib64/libstdc++.so.6 | grep GLIBC

出力結果は次のとおりです.
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

以上の出力から、gccのダイナミックライブラリは古いバージョンであることがわかります.これらの問題は、gccをアップグレードすると、生成されたダイナミックライブラリが古いバージョンgccのダイナミックライブラリに置き換えられないためです.
2.問題処理
次のコマンドを実行して、gccをコンパイルしたときに生成された最新のダイナミックライブラリを検索します.
find / -name "libstdc++.so*"

出力は次のとおりです.
/home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21  //     
……
/home/gcc-5.2.0/gcc-tempはgccアップグレード時の出力ディレクトリである.
上記の最新のダイナミックライブラリlibstdc++.so.6.0.21/usr/lib64ディレクトリにコピーします.
cp /home/gcc-5.2.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21 /usr/lib64

レプリケーション後、システムのデフォルト動的ライブラリの指向を変更します.すなわち、デフォルトライブラリのソフト接続を再構築します.
作業ディレクトリを/usr/lib64に切り替えます.
cd /usr/lib64

元のソフト接続を削除:
rm -rf libstdc++.so.6

デフォルトライブラリのソフト接続を最新のダイナミックライブラリに移動します.
ln -s libstdc++.so.6.0.21 libstdc++.so.6

デフォルトのダイナミックライブラリのアップグレードが完了しました.次のコマンドを再実行して、ダイナミックライブラリを確認します.
strings /usr/lib64/libstdc++.so.6 | grep GLIBC

次のように出力されます.
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

原文住所:http://itbilu.com/linux/management/NymXRUieg.html