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