web-dev-qa-db-ja.com

GLIBCXXバージョン

マシンで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.4からGLIBCXX_3.4.14。他のシステムでは、代わりに、GLIBCXX_3.4.8(libstdc ++。so.6.0.8を入手した)。

そこで、いくつか質問があります。

  1. リンカがC++バイナリをlibstdc ++バージョンに対してリンクする理由GLIBCXX_3.4.9 の代わりに GLIBCXX_3.4.14

  2. Libstdc ++バージョンに対してバイナリをコンパイルした場合GLIBCXX_3.4ほぼすべての場所で実行されると思います。それは何らかの問題を意味しますか? (例:古いアルゴリズムを使用しますか?

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

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

36
peoro

_readelf -a_および_objdump -x_を使用して、stringsに優先してELFファイルを検査します。

実際、すべてのGLIBCXX_ *バージョンはライブラリ全体に適用されるのではなく、各シンボルに適用されます(シンボルのバージョン管理、 DSO-howto を参照)。したがって、たとえば、同じライブラリファイルに_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で導入された/変更されたセマンティクスを持つシンボルに対してリンクされていることを意味します。

35
ninjalj
  1. システムにインストールされているライブラリバージョン。 glibcバージョン3.4.14を手動でビルドしてリンクすることができます
  2. 場合によります。後のバージョンでいくつかの問題が修正された可能性があります。プログラムのユーザーは、プログラムに必要なバージョンにリンクする必要があります
  3. メモリ使用量が多い
  4. はい、適切なパラメーターをリンカーに渡します。特定のバージョンのライブラリが必要な場合は、ダウンロードして手動でビルドし、リンクすることをお勧めします。

[〜#〜] edit [〜#〜]

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

0
BЈовић