マシンで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を入手した)。
そこで、いくつか質問があります。
リンカがC++バイナリをlibstdc ++バージョンに対してリンクする理由GLIBCXX_3.4.9
の代わりに GLIBCXX_3.4.14
?
Libstdc ++バージョンに対してバイナリをコンパイルした場合GLIBCXX_3.4
ほぼすべての場所で実行されると思います。それは何らかの問題を意味しますか? (例:古いアルゴリズムを使用しますか?
代わりに静的 libstdc ++にプログラムをリンクする場合、どこでも実行されると思います。もちろん、バイナリはもっと大きくなります(〜1MB)、他の長所/短所はありますか?
Libstdc ++の特定のバージョンに対してバイナリをリンクさせることはできますか?
_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で導入された/変更されたセマンティクスを持つシンボルに対してリンクされていることを意味します。
[〜#〜] edit [〜#〜]
静的にリンクされたライブラリがメモリ使用量を増やすことを思い出しました。