DLLとLIBについては、プログラムを正しく実行するために必要な重要なコード(ライブラリ)が含まれていることを除けば、ほとんど知りません。しかし、なぜコンパイラーはそれらをまったく生成しないのでしょうか?すべてのコードを単一の実行可能ファイルに含める方が簡単ではないでしょうか。そして、DLLとLIBの違いは何ですか?
5 に答える
静的ライブラリ(LIB)と動的ライブラリ(DLL)がありますが、.LIBファイルは静的ライブラリ(オブジェクトファイルを含む)またはインポートライブラリ(リンカーがDLLにリンクできるようにする記号を含む)のいずれかであることに注意してください。
多くのプログラムで使用したいコードがある場合があるため、ライブラリが使用されます。たとえば、文字列内の文字数をカウントする関数を作成する場合、その関数は多くのプログラムで役立ちます。その関数が正しく機能するようになったら、使用するたびにコードを再コンパイルする必要がないため、その関数の実行可能コードをライブラリに配置すると、リンカーはコンパイルされたコードを抽出してプログラムに挿入できます。 。このため、静的ライブラリは「アーカイブ」と呼ばれることもあります。
ダイナミックライブラリはこれをさらに一歩進めます。ライブラリ関数の複数のコピーが各プログラムのスペースを占めるのは無駄に思えます。なぜそれらすべてが関数の1つのコピーを共有できないのですか?これがダイナミックライブラリの目的です。ライブラリコードをコンパイル時にプログラムに組み込むのではなく、メモリにロードするときにプログラムにマッピングすることで実行できます。同じ機能を使用する複数のプログラムを同時に実行すると、すべて1つのコピーを共有できるため、メモリを節約できます。実際、コードを通過するパスに応じて、必要な場合にのみダイナミックライブラリをロードできます。印刷を行っていない場合は、プリンタルーチンがメモリを消費することに意味はありません。一方、これは、プログラムを実行するすべてのマシンにダイナミックライブラリのコピーをインストールする必要があることを意味します。
例として、「C」で記述されたほとんどすべてのプログラムは、「Cランタイムライブラリ」と呼ばれるライブラリの関数を必要としますが、すべての関数を必要とするプログラムはほとんどありません。Cランタイムには静的バージョンと動的バージョンの両方が用意されているため、特定のニーズに応じて、プログラムで使用するバージョンを決定できます。
もう1つの側面は、セキュリティ(難読化)です。コードの一部がメインアプリケーションから抽出され、「分離された」ダイナミックリンクライブラリに配置されると、コードは分離されているため、攻撃、分析(リバースエンジニアリング)が容易になります。同じコードがLIBライブラリに保持されている場合、それはコンパイルされた(リンクされた)ターゲットアプリケーションの一部であるため、そのコードを残りのターゲットバイナリから分離(区別)するのは困難です。
コードを実行可能ファイルにコンパイルするだけでなく、DLL / LIBを作成する重要な理由の1つは、再利用と再配置です。平均的なJavaまたは.NETアプリケーション(たとえば)は、ほとんどの場合、いくつかのサードパーティ(またはフレームワーク)ライブラリを使用します。すべてのサードパーティコードをアプリケーションにコンパイルするよりも、ビルド済みのライブラリに対してコンパイルする方がはるかに簡単で高速です。コードをライブラリにコンパイルすると、さまざまなタイプのアプリケーションで使用するクラスを設計するなど、優れた設計手法も促進されます。
DLLは、他の実行可能プログラム間で共有される関数のライブラリです。あなたのwindows/system32ディレクトリを見るだけで、それらの数十が見つかります。プログラムがDLLを作成すると、通常はlibファイルも作成されるため、アプリケーション*.exeプログラムはDLLで宣言されているシンボルを解決できます。
.libは、プログラムに静的にリンクされている関数のライブラリです。他のプログラムとは共有されていません。* .libファイルにリンクする各プログラムには、そのファイルにすべてのコードが含まれています。C.libとリンクする2つのプログラムA.exeとB.exeがある場合、各AとBの両方にC.libのコードが含まれます。
DLLとライブラリを作成する方法は、使用するコンパイラによって異なります。各コンパイラはそれを異なる方法で行います。
もう1つの違いは、パフォーマンスにあります。
DLLは実行時に.exe(s)によってロードされるため、.exe(s)とDLLは共有メモリの概念で動作するため、静的リンクに比べてパフォーマンスが低くなります。
一方、.libは、コンパイル時に要求するすべてのプロセスに静的にリンクされるコードです。したがって、.exeには単一のメモリがあり、プロセスのパフォーマンスが向上します。