DLLおよびLIBファイル-何を、そしてなぜ?


214

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


回答:


296

静的ライブラリ(LIB)と動的ライブラリ(DLL)がありますが、.LIBファイルは静的ライブラリ(オブジェクトファイルを含む)またはインポートライブラリ(リンカーがDLLにリンクできるようにするシンボルを含む)のいずれかであることに注意してください。

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

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

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


80
ことが判明し.LIBたファイルは、静的(オブジェクト・ファイルを含む)、ライブラリやインポートライブラリ(DLLへのリンクへのリンカーを許可するようにシンボルを含む)することができます。なぜそうなのだろう。
ルミ

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

4
@ルミ:良い点。DLLに関しては、2種類のリンクがあります。暗黙的なリンク.lib適切なヘッダーと共にDLL作成者から提供されたファイルがある場合。これ.libは単にターゲットDLLの記述子であり、アドレス、エントリポイントなどが含まれますが、コードは含まれません。これ.libはリンカに渡す必要があります。2つ目は、DLLを関数で手動でロードして使用する場合の明示的なリンクLoadLibraryです。このタイプでは.lib、そのファイルは必要ありませんが、DLLエクスポートとそのアドレスを見つけて、ポインタを介してこれらの関数を呼び出すように少し努力する必要があります。
イタチ

37

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


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

1
しかし、LIBも分離されていますね。したがって、攻撃者は単純にLIBを分析できます。それとも、LIBが一般に公開されていないという一般的なシナリオですか?
Nick Russler、2014年

8
コンパイラプロセスに関する限り、LIBも「分離」されていますが、リンカがパーツを組み合わせると、LIBはEXEの一部となり、独自のコードと区別できなくなります。
mox 2014年

17

コードを実行可能ファイルにコンパイルするだけでなく、DLL / LIBを作成する重要な理由の1つは、再利用と再配置です。平均的なJavaまたは.NETアプリケーション(たとえば)は、おそらくいくつかのサードパーティ(またはフレームワーク)ライブラリを使用します。サードパーティのコードをすべてアプリケーションにコンパイルする必要はなく、事前に構築されたライブラリに対してコンパイルする方がはるかに簡単で高速です。コードをライブラリにコンパイルすると、たとえば、さまざまなタイプのアプリケーションで使用されるクラスを設計するなど、優れた設計プラクティスが促進されます。


7

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

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

DLLおよびlibの作成方法は、使用するコンパイラーによって異なります。コンパイラごとに異なる方法で行われます。


4

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.