web-dev-qa-db-ja.com

DLLおよびLIBファイル-何と理由?

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

192
Xonara

静的ライブラリ(LIB)と動的ライブラリ(DLL)があります。

多くのプログラムで使用したいコードがある場合があるため、ライブラリが使用されます。たとえば、文字列内の文字数をカウントする関数を作成すると、その関数は多くのプログラムで役立ちます。その関数が正常に機能するようになったら、使用するたびにコードを再コンパイルする必要はありません。そのため、その関数の実行可能コードをライブラリに配置すると、リンカーはコンパイルされたコードを抽出してプログラムに挿入できます。このため、静的ライブラリは「アーカイブ」と呼ばれることもあります。

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

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

259

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

32
mox

コードを単に実行可能ファイルにコンパイルするのではなく、DLL/LIBを作成する1つの重要な理由は、再利用と再配置です。平均的なJavaまたは.NETアプリケーション(たとえば)は、多くの場合、複数のサードパーティ(またはフレームワーク)ライブラリを使用します。すべてのサードパーティコードをアプリケーションにコンパイルするよりも、ビルド済みのライブラリに対してコンパイルする方がはるかに簡単で高速です。コードをライブラリにコンパイルすることは、優れた設計慣行も奨励します。さまざまなタイプのアプリケーションで使用されるクラスを設計します。

13
Andy White

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

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

DLLとライブラリの作成方法は、使用するコンパイラによって異なります。コンパイラごとに異なる方法で実行します。

8

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

DLLは実行時に.exeによってロードされるため、.exeおよびDLLは共有メモリの概念で動作するため、静的に比べてパフォーマンスが低くなります。リンク。

一方、.libは、コンパイル時に静的にリンクされ、要求するすべてのプロセスにリンクされるコードです。そのため、.exeには単一のメモリがあり、プロセスのパフォーマンスが向上します。

4