6

スタティックライブラリとダイナミックライブラリのサイズの違いについては、 boostの静的ライブラリは動的ライブラリよりはるかに大きいことがわかりました。スタティックライブラリとダイナミック(デバッグ)ライブラリのサイズの違いと最終的なexeへの影響

例えば、デバッグマルチスレッドブーストウェーブスタティックライブラリのサイズは97.7 mbですが、同じライブラリが動的であるのは(インポートライブラリとdllを含む)です。それは大きな違いです。 なぜですか?

2番目の質問ですが、私が静的にリンクしているとしますと、waveライブラリです。それは私の実行ファイルが97.7 mb以上のサイズのバルーンになることを意味しますか?

答えて

4

スタティックライブラリには完全なデバッグシンボル情報があります。 DLLの場合、その情報は.pdbファイルにあります(これは、静的なlibと似ていると想定しています)。

静的なライブラリにリンクすると、シンボル情報は.exeにコピーされません.pdbファイルに配置されます(ビルドが.pdbファイルを作成するように設定されている場合)。 .pdbファイルは、.pdbの作成の有無にかかわらず、.exeで配布する必要はありません。

私がboostpro.comから入手したあらかじめ構築されたライブラリのダウンロードでは、彼らが提供するブーストDLL用の.pdbファイルがありません。 DLLを自分でビルドすると、おそらく.pdbファイルが取得されます(詳細についてはわかりませんが、いくつかのconfigオプションを設定する必要があります)。


アップデート:私は簡単にブーストDLLを.PDBファイルを得ることについて間違っているかもしれないよう

が見えます。http://comments.gmane.org/gmane.comp.lib.boost.build/23246から:

> Is there an additional option that I can pass on the command line to 
> have the (correctly generated) PDB files also copied into the stage 
> directory? 

ないこの時点で。あなただけ <install-type>SHARED_LIBまたは <install-type>STATIC_LIBは今書か ですどこでも<install-type>PDBを追加 に tools/build/v2/tools/package.jamをハックすることができます。

+2

これは非常に興味深いものです...デバッグ情報でリリースの静的ライブラリをコンパイルしていますか?そうすれば、プログラム全体の最適化ができなくなり、コードが遅くなります(または私は間違っています)。 – Samaursa

+0

.pdbファイルはWindows/Visual Studioを前提としていますが、これは質問には記載されていませんが、有効である可能性があります。 –

+0

@トニー:そうだよ - "私のセットアップで..." –

3

いいえ、LIBファイルが特定のサイズであるため、EXEにそのサイズが追加されるわけではありません。実際、ほとんどのリンカーは、使用されているものだけをリンクするほどスマートです。それをすべてを含んでいなければならない動的ライブラリと比較してください。

静的ライブラリは間違いなくあなたのEXEを大きくしますが、私はいつもそれを好みます。次に、実行時にライブラリが見つからない、または互換性がないことを心配する必要はありません。 (または少なくとも、私はこれの可能性を最小限に抑えます)。

0

デバッグ情報が含まれているため、サイズの違いが大きく異なります。

1

スタティックライブラリには完成したバイナリデータが含まれていないため、リンカがバイナリをビルドするために必要な情報であるため、この情報はビルドされたバイナリよりも大きい場合があります。

ヘッダファイルに定義されている関数がcpp-fileで使用されている場合、コンパイラはそのコードをインラインまたは単に追加して結果のオブジェクトファイルに格納します。これは、重複がたくさんあることを意味します。静的ライブラリはリンカを減らすのを待つだけです:)

通常、実行可能ファイルのサイズは通常、静的ライブラリでは大きくなりますが、実行可能ファイルのサイズは通常、動的ライブラリと比べて小さくなります。 DLLとEXEは別々にリンクされているため、リンカはDLLに必要な機能と投げ捨てられる機能を知ることができません。静的ライブラリの場合、リンカはそのような情報を持ち、使用されているobjファイルのみを取ることができます。

関連する問題