1. ホーム
  2. dll

[解決済み] DLLとLIBファイル - 何が、なぜ?

2022-02-27 18:45:03

質問

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

どのように解決するのですか?

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

ライブラリーを使用するのは、多くのプログラムで使用したいコードがあるためです。例えば、文字列の文字数を数える関数を書いた場合、その関数は多くのプログラムで役に立ちます。そのため、その関数の実行コードをライブラリに置き、リンカはコンパイルされたコードを取り出して、プログラムに挿入することができます。このような理由から、スタティック・ライブラリは「アーカイブ」と呼ばれることがあります。

ダイナミック・ライブラリは、これをさらに一歩進めたものです。ライブラリ関数のコピーが複数あり、それぞれのプログラムの中でスペースを取っているのは無駄なように思えます。1つの関数のコピーを皆で共有することはできないのでしょうか?これを実現するのがダイナミック・ライブラリです。コンパイル時にライブラリのコードをプログラムに組み込むのではなく、メモリに読み込まれた時点でプログラムにマッピングして実行することができるのです。同じ関数を使う複数のプログラムを同時に実行する場合、1つのコピーを共有できるので、メモリを節約することができます。実際、ダイナミックライブラリは、コードのパスに応じて、必要なときだけロードすることができます。印刷をしないのにプリンタルーチンがメモリを消費するのは意味がありません。一方、このことは、プログラムを実行するすべてのマシンにダイナミックライブラリのコピーをインストールする必要があることを意味します。これは、独自の問題点を生み出します。

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