2009-05-27 3 views
153

私はDLLとLIBがプログラムを正しく実行するために必要な重要なコードを含んでいること以外はほとんど何も知らない - ライブラリ。しかし、なぜコンパイラはそれらを生成しますか?すべてのコードを単一の実行ファイルに含めるほうが簡単ではないでしょうか? DLLとLIBの違いは何ですか?DLLファイルとLIBファイル - 何で、なぜですか?

答えて

220

スタティックライブラリ(LIB)とダイナミックライブラリ(DLL)があります。

多くのプログラムで使用するコードがある可能性があるため、ライブラリが使用されています。たとえば、文字列内の文字数を数える関数を記述すると、その関数は多くのプログラムで役立ちます。その関数が正しく動作するようになると、使用するたびにコードを再コンパイルしたくないので、その関数の実行可能コードをライブラリに入れ、リンカーはコンパイルしたコードをプログラムに挿入して挿入することができます。このため、静的ライブラリは「アーカイブ」と呼ばれることがあります。

ダイナミックライブラリはこれをさらに進めます。ライブラリ関数の複数のコピーを各プログラムのスペースを占有することは無駄に思えます。なぜ彼らはすべての機能のコピーを共有できませんか?これは、動的ライブラリのためのものです。コンパイル時にライブラリコードをプログラムに組み込むのではなく、メモリにロードされるときにプログラムにマップすることで実行できます。同じ機能を使用する複数のプログラムが同時に実行されると、すべて1つのコピーを共有してメモリを節約できます。実際には、コードのパスに応じて、必要に応じて動的ライブラリのみをロードすることができます。何も印刷をしていない場合、プリンタルーチンがメモリを占有することはありません。一方、これは、プログラムが実行されているすべてのマシンに動的ライブラリのコピーをインストールする必要があることを意味します。これにより、独自の問題が発生します。

例として、「C」で書かれたほとんどすべてのプログラムは、「Cランタイムライブラリ」というライブラリの関数を必要としますが、すべての関数を必要とするプログラムはほとんどありません。 Cランタイムは静的バージョンと動的バージョンの両方で提供されるため、特定のニーズに応じてプログラムが使用するバージョンを判断できます。

+49

'.LIB'ファイルは、静的ライブラリ(オブジェクトファイルを含む)またはインポートライブラリ(リンカがDLLにリンクするためのシンボルを含む)のいずれかになります。 [私はこれがなぜであるのだろうと思っています](http://stackoverflow.com/q/6421693/269126) – Lumi

+1

良い説明!コードは共有され、データは(デフォルトで)Dllを消費するアプリケーション間で共有されません。 – mox

10

コードを実行可能ファイルにコンパイルするのではなく、DLL/LIBを作成する重要な理由の1つは、再利用と再配置です。 Javaや.NETの平均的なアプリケーション(たとえば)は、サードパーティ製(またはフレームワーク)ライブラリをいくつか使用する可能性が高いです。サードパーティのコードをすべてアプリケーションにコンパイルするのではなく、あらかじめ構築されたライブラリをコンパイルする方がはるかに簡単で高速です。コードをライブラリにコンパイルすると、良いデザインプラクティスも奨励されます。さまざまな種類のアプリケーションで使用するようにクラスを設計します。

24

もう1つの側面はセキュリティ(難読化)です。一度コードがメインアプリケーションから抽出され、 "分離された"ダイナミックリンクライブラリに置かれると、コードが分離されているため、コードを攻撃、分析(リバースエンジニアリング)する方が簡単です。同じコードがLIBライブラリに保持されている場合、コンパイルされた(リンクされた)ターゲットアプリケーションの一部であるため、残りのターゲットバイナリからそのコードを分離(区別)することは難しくなります。

+0

セキュリティ面は私にとって初めてのものでした。上記の推論は、ネイティブのアンマネージドC++ dllを呼び出すC#アプリケーションの場合にも当てはまりますか? – Martin

+0

しかし、LIBも分離されていますか?そのため、攻撃者は単にLIBを分析できます。または、LIBに一般市民がアクセスできないという共通のシナリオですか? –

+3

コンパイラプロセスに関する限り、LIBも "分離"されていますが、リンカがパーツを一緒に配置すると、LIBはEXEの一部であり、独自のコードと区別できません。 – mox

7

DLLは、他の実行可能プログラム間で共有される関数のライブラリです。あなたのwindows/system32ディレクトリを見ると、それらの数十を見つけることができます。プログラムがDLLを作成するときには、アプリケーション* .exeプログラムがDLLで宣言されたシンボルを解決できるように、通常はlibファイルも作成されます。

.libは、プログラムに静的にリンクされた関数のライブラリです。これらの関数は他のプログラムと共有されません。 * .libファイルとリンクする各プログラムは、そのファイル内のすべてのコードを持っています。 C.libとリンクする2つのプログラムA.exeとB.exeをお持ちの場合は、それぞれのAとBの両方にC.libのコードが含まれます。

DLLとライブラリの作成方法は、使用するコンパイラによって異なります。各コンパイラはそれを異なった方法で行います。

2

もう1つの違いは、パフォーマンスにあります。

DLLは実行時に.exeで読み込まれるため、.exe(s)とDLLは共有メモリの概念で動作するため、パフォーマンスは静的リンクと比較して低くなります。

一方、.libはコンパイル時に要求するすべてのプロセスに静的にリンクされるコードです。したがって、.exe(s)は1つのメモリを持つため、プロセスのパフォーマンスが向上します。

関連する問題