web-dev-qa-db-ja.com

GLIBCXX_3.4.9が見つかりません

libstdc++.soについて問題があります。

新しいバージョンのgccをインストールし、C++コードをコンパイルしようとしました。コンパイルは機能しましたが、バイナリを実行しようとすると(m5.optはその名前です)、次のエラーが発生しました。

build/ALPHA_SE/m5.opt: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by build/ALPHA_SE/m5.opt).

libstdc++.soを交換する必要がありますか?必要な場合、どこでダウンロードできますか? GCCウェブサイトでは、libstdc ++は現在gccの一部であると彼らは言っています。

細部

GCC:以前にgcc 4.1.2を使用していましたが、gcc 4.2.4をダウンロードしました。解凍したgccディレクトリから./configureを実行しました。作る; Sudo make install`。 gccまたはg ++を使用してコンパイルしようとしたとき、デフォルトのバージョンはまだ4.1.2でした。これを克服するために、いくつかのリンクを置き換えました:

mv /usr/bin/gcc /usr/bin/gcc_bak
ln -s /usr/local/bin/gcc gcc
mv /usr/bin/g++ /usr/bin/g++_bak
ln -s /usr/local/bin/g++ g++

GLIBC(++)-libstdc ++:

/usr/lib64/libstdc++.so.6 -> libstdc++.so.6.0.8
/usr/local/lib/libstdc++.so -> libstdc++.so.6.0.9
/lib/libc.so.6 -> libc-2.5.so -> libc-2.5.so

Linuxバージョン:uname -aは以下を提供します:

Linux madmax 2.6.18-128.4.1.el5 #1 SMP Tue Aug 4 12:51:10 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

22
Maximilien

問題は、新しいGCCを誤って作成したことです。Linuxでは、

./configure --prefix=/usr

デフォルトのインストールプレフィックスは/usr/localです。これがmake installgccおよびg++バイナリを/usr/local/binなどに入れる理由です。

今起こっていることは、新しい(シンボリック)GCC 4.2.4を使用してコンパイルおよびリンクすることですが、実行時にプログラムは古い/usr/lib64/libstdc++.so.6にバインドします(バージョン6.0.8ではなく、必要な6.0.9)。 。 ldd build/ALPHA_SE/m5.optを実行すると確認できます。/usr/lib64/libstdc++.so.6が使用されていることがわかります。

あなたができるいくつかの修正があります。

env LD_LIBRARY_PATH=/usr/local/lib64 ldd build/ALPHA_SE/m5.opt

バイナリを正しいライブラリにリダイレクトするには、LD_LIBRARY_PATHの設定で十分であることを示す必要があります。

LD_LIBRARY_PATH=/usr/local/lib64 build/ALPHA_SE/m5.opt

実行する必要があります。このパスを-Wl,-rpath=/usr/local/lib64と再リンクすることで、m5.optバイナリに「焼き付ける」ことができます。

より永続的な解決策は、バイナリを修正したのと同じ方法でライブラリを修正することです。

cd /usr/lib64 && mv libstdc++.so.6 libstdc++.so.6_bak &&
ln -s /usr/local/lib64/libstdc++.so.6 .

さらに良い解決策は、新しいGCC--prefix=/usr、次にmake all installで再構成することです。

26

これは非常に古い質問であることは知っていますが、...

通常、システムコンパイラ(/usrに含まれるコンパイラ)を置き換えることはお勧めしません。これは、システム全体がそれで構築され、それに依存しているためです。

通常、新しいコンパイラを別の場所にインストールしてから、libstdc ++を確認することをお勧めしますFAQ 動的にリンクされたライブラリが確実に見つかるようにするにはどうすればよいですか? および 実行時に正しいlibstdc ++。soが確実に見つかるようにする方法については、マニュアルで動的または共有ライブラリ を検索する。

8
Jonathan Wakely

ここでの他の答えは問題ないはずですが、gccを/ usr/local /にインストールした場合の「迅速で簡単な」解決策は、LD_LIBRARY_PATHに新しいライブラリを追加することです。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64

をチェックして、適切なバージョンのGLIBCがインストールされているかどうかを確認することもできます。

strings /usr/lib/libstdc++.so.6 | grep GLIBC
strings /usr/local/lib64/libstdc++.so.18 | grep GLIBC

私はこの最後のヒントを別のフォーラムから受け取ったので、クレジットが必要です。

5
Colin D