40

自分のマシンで C++ プログラムをコンパイルし、それを別のマシン (古いソフトウェアを使用) で実行すると、次のようになります/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found

実際、私のシステムでは glibc の方が新しく (gcc-libs 4.5.1: libstdc++.so.6.0.14 を取得しました)、strings /usr/lib/libstdc++.so.6 | grep GLIBCXXから に出力さGLIBCXX_3.4GLIBCXX_3.4.14ます。GLIBCXX_3.4.8代わりに、他のシステムでは、 (libstdc++.so.6.0.8 を取得しました)までしか出力されません。

だから私はいくつかの質問があります:

  1. GLIBCXX_3.4.9リンカーが C++ バイナリをではなくlibstdc++ バージョンにリンクするのはなぜGLIBCXX_3.4.14ですか?

  2. libstdc++ バージョンに対してバイナリをコンパイルした場合、GLIBCXX_3.4ほとんどどこでも実行されると思います。それは何らかの問題を意味しますか?(例: 古い、したがってより悪いアルゴリズムの実装を使用しますか?)

  3. 代わりに、プログラムを libstdc++ に対して静的にリンクすると、どこでも実行されると思います。もちろん、バイナリははるかに大きくなります(〜1MB)。他に長所/短所はありますか?

  4. リンカーに、特定のバージョンの libstdc++ に対してバイナリをリンクさせることはできますか?

4

3 に答える 3

39

readelf -aとを使用して、objdump -xよりも ELF ファイルを検査しますstrings

実際には、すべての GLIBCXX_* バージョンがライブラリ全体に適用されるのではなく、各シンボルに適用されます (シンボルのバージョン管理、DSO-howtoを参照)。したがって、同じライブラリ ファイルにeg:std::char_traits<wchar_t>::eq@@GLIBCXX_3.4.5を含めることができます。std::ios_base::Init::~Init()@@GLIBCXX_3.4

あなたのプログラムが GLIBCXX_3.4.9 を必要とするという事実は、おそらく、GLIBCXX_3.4.9 で導入/変更されたシンボルに対してリンクされていることを意味します。

于 2010-11-09T13:04:27.307 に答える
1
  1. システムにインストールされているライブラリのバージョン。glibc バージョン 3.4.14 を手動でビルドしてリンクすることができます
  2. 場合によります。おそらく、新しいバージョンではいくつかの問題が修正されました。プログラムのユーザーは、プログラムが必要とするバージョンにリンクする必要があります
  3. メモリ使用量が高くなる
  4. はい、適切なパラメーターをリンカーに渡します。特定のバージョンのライブラリが必要な場合は、ダウンロードして手動でビルドし、リンクすることをお勧めします。

編集

静的にリンクされたライブラリがメモリ使用量を増やすことを思い出しました。

于 2010-11-09T12:44:43.710 に答える
-1

私の意見では、バイナリが新しい GLIBCXX バージョンの新機能を使用していない場合、それらはそのバージョンにリンクされません。したがって、バイナリは GLBCXX 3.4.9 にリンクされています。そこからエクスポートされたシンボルが少なくとも 1 つ必要であり、3.4.9 より新しいバージョンからエクスポートされたシンボルはありません。

于 2016-06-01T02:33:59.517 に答える