静的ライブラリと動的 (デバッグ) ライブラリのサイズの違いと最終的な実行への影響
-
26-09-2019 - |
質問
今日、Boost のビルド済みライブラリをダウンロードするまで、静的ライブラリと動的ライブラリのサイズの違いについてあまり考えたことはありませんでした。boost の静的ライブラリは動的ライブラリよりもはるかに大きいことがわかりました。
たとえば、デバッグ用マルチスレッド ブースト ウェーブ静的ライブラリは次のとおりです。 97.7 mb
同じライブラリでも、サイズは動的ですが、 1.4 mb
サイズ (インポート ライブラリと DLL を含む)!それは大きな違いです。 何故ですか?
2 番目の質問は、たとえば、 wave
図書館。それは、私の実行ファイルのサイズがそれ以上に膨らむことを意味しますか? 97.7 mb
?
解決
静的ライブラリは、それらの中に完全なデバッグシンボル情報を持っています。 DLLの情報は(私は静的LIBSのと大きさが同様であろうと仮定)の.pdbファイルになること。
あなたは、静的libににリンクすると、は、シンボル情報は、.exeファイルにコピーされることはありません - それは、.PDBファイルに配置されます(あなたのビルドが.pdbファイルを作成するように構成されている場合)。 .pdbファイルが.PDBが作成されているかどうか、.exeファイルと一緒に配布する必要はありません。
私はboostpro.comから入手事前に構築されたライブラリのダウンロードでは、私は彼らが提供するブーストDLLの.PDBファイルを得ることはありません。あなたのDLLを自分でビルドする場合(あなたは、私は詳細が何であるか見当がつかないいるいくつかの設定オプションを設定する必要があるかもしれませんが)、あなたはおそらく.PDBファイルを取得します。
<時間>アップデートます:
私は簡単にブースト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?
現時点ではできません。あなただけハックすることができ
tools/build/v2/tools/package.jam
へ どこでもどこ<install-type>PDB
を追加<install-type>SHARED_LIB
か<install-type>STATIC_LIB
は今あります 書かれています。
他のヒント
いいえ、LIBファイルが特定のサイズであるという理由だけで、それはあなたのEXEにそのサイズを追加するという意味ではありません。実際には、ほとんどのリンカーは、使われているだけのものではリンクにスマート十分です。すべてが含まれている必要があり、動的ライブラリにあることを比較します。
静的ライブラリは間違いなくあなたのEXEを大きくするが、私はいつもそれを好みます。それから私は、実行時にライブラリが見つからないか、互換性のない心配する必要はありません。 (あるいは、少なくとも、私はこの可能性を最小限に抑えることができます。)
静的ライブラリが完成したバイナリデータが含まれているのではなく、ビルドバイナリにリンカに必要な情報はありませんので、この情報が内蔵されたバイナリよりも大きくなることがあります。
ヘッダファイルに定義されたいくつかの関数がCPP-ファイルで使用される場合、は、コンパイラはオブジェクトファイルを得へのコード(インライン、または単に追加のいずれか)を置きます。これは、重複が多いことを意味します。それらをマージすることのリンカの仕事をするので、静的ライブラリはちょうどリンカが減少するのを待ち:)
は、実行の一般的サイズは、静的ライブラリと通常大きいが、動的ライブラリの実行可能一緒のサイズは通常小さいです。 DLLとEXEは、個別にリンクされているので、リンカはDLLで必要とされると投げ出さできるどの機能を知ることができません。静的ライブラリの場合では、リンカーは、そのような情報を持っており、使用されているもののみOBJ-のファイルを取ることができます。
デバッグ静的ライブラリは、巨大なサイズの違いを説明デバッグ情報が含まれています。