9

約 15 のクラスとそのメンバー関数などの C++ コンパイル済み静的ライブラリがあり、コンパイルすると、ほぼ 14 メガバイトになります。これは Google の密なハッシュ テーブル ライブラリと MPIR (Windows の GMP のようなもの) にリンクしていますが、プレーンな exe でそれを行ったところ、数キロバイトでした。なぜそんなに巨大なのですか?サイズを小さくするにはどうすればよいですか?私のプログラムよりもはるかに複雑で、はるかに小さいプログラムが他にもあるようです。

Visual C++ でコンパイルされたコマンド ラインは次のとおりです。

/Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE"
/D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t
/Zc:forScope /Fp"Release\ang.pch" /Fa"Release\" /Fo"Release\"
/Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue
4

1 に答える 1

19

静的ライブラリは、完成したバイナリとはかなり異なる形式です。部分的には、かなり多くの情報があるためです。基本的に、静的ライブラリは、翻訳単位から生成されたすべての .obj ファイルの ZIP のように機能します。これにより、リンカは未使用の関数を捨てることができ、LTCG を使用している場合は、インライナがモジュール間の決定やその他の最適化を行うことができます。

さらに、一部のコンパイル モードでは、デバッグ シンボルが .lib に直接埋め込まれ、個別の .pdb ファイルが不要になります。

通常、静的ライブラリのサイズを気にする必要はありません。リンカーは、最終的な実行可能ファイルをビルドするときにすべての余分な情報を破棄します。

于 2010-07-26T04:46:10.277 に答える