私はDLLとLIBがプログラムを正しく実行するために必要な重要なコードを含んでいること以外はほとんど何も知らない - ライブラリ。しかし、なぜコンパイラはそれらを生成しますか?すべてのコードを単一の実行ファイルに含めるほうが簡単ではないでしょうか? DLLとLIBの違いは何ですか?DLLファイルとLIBファイル - 何で、なぜですか?
答えて
スタティックライブラリ(LIB)とダイナミックライブラリ(DLL)があります。
多くのプログラムで使用するコードがある可能性があるため、ライブラリが使用されています。たとえば、文字列内の文字数を数える関数を記述すると、その関数は多くのプログラムで役立ちます。その関数が正しく動作するようになると、使用するたびにコードを再コンパイルしたくないので、その関数の実行可能コードをライブラリに入れ、リンカーはコンパイルしたコードをプログラムに挿入して挿入することができます。このため、静的ライブラリは「アーカイブ」と呼ばれることがあります。
ダイナミックライブラリはこれをさらに進めます。ライブラリ関数の複数のコピーを各プログラムのスペースを占有することは無駄に思えます。なぜ彼らはすべての機能のコピーを共有できませんか?これは、動的ライブラリのためのものです。コンパイル時にライブラリコードをプログラムに組み込むのではなく、メモリにロードされるときにプログラムにマップすることで実行できます。同じ機能を使用する複数のプログラムが同時に実行されると、すべて1つのコピーを共有してメモリを節約できます。実際には、コードのパスに応じて、必要に応じて動的ライブラリのみをロードすることができます。何も印刷をしていない場合、プリンタルーチンがメモリを占有することはありません。一方、これは、プログラムが実行されているすべてのマシンに動的ライブラリのコピーをインストールする必要があることを意味します。これにより、独自の問題が発生します。
例として、「C」で書かれたほとんどすべてのプログラムは、「Cランタイムライブラリ」というライブラリの関数を必要としますが、すべての関数を必要とするプログラムはほとんどありません。 Cランタイムは静的バージョンと動的バージョンの両方で提供されるため、特定のニーズに応じてプログラムが使用するバージョンを判断できます。
コードを実行可能ファイルにコンパイルするのではなく、DLL/LIBを作成する重要な理由の1つは、再利用と再配置です。 Javaや.NETの平均的なアプリケーション(たとえば)は、サードパーティ製(またはフレームワーク)ライブラリをいくつか使用する可能性が高いです。サードパーティのコードをすべてアプリケーションにコンパイルするのではなく、あらかじめ構築されたライブラリをコンパイルする方がはるかに簡単で高速です。コードをライブラリにコンパイルすると、良いデザインプラクティスも奨励されます。さまざまな種類のアプリケーションで使用するようにクラスを設計します。
もう1つの側面はセキュリティ(難読化)です。一度コードがメインアプリケーションから抽出され、 "分離された"ダイナミックリンクライブラリに置かれると、コードが分離されているため、コードを攻撃、分析(リバースエンジニアリング)する方が簡単です。同じコードがLIBライブラリに保持されている場合、コンパイルされた(リンクされた)ターゲットアプリケーションの一部であるため、残りのターゲットバイナリからそのコードを分離(区別)することは難しくなります。
DLLは、他の実行可能プログラム間で共有される関数のライブラリです。あなたのwindows/system32ディレクトリを見ると、それらの数十を見つけることができます。プログラムがDLLを作成するときには、アプリケーション* .exeプログラムがDLLで宣言されたシンボルを解決できるように、通常はlibファイルも作成されます。
.libは、プログラムに静的にリンクされた関数のライブラリです。これらの関数は他のプログラムと共有されません。 * .libファイルとリンクする各プログラムは、そのファイル内のすべてのコードを持っています。 C.libとリンクする2つのプログラムA.exeとB.exeをお持ちの場合は、それぞれのAとBの両方にC.libのコードが含まれます。
DLLとライブラリの作成方法は、使用するコンパイラによって異なります。各コンパイラはそれを異なった方法で行います。
もう1つの違いは、パフォーマンスにあります。
DLLは実行時に.exeで読み込まれるため、.exe(s)とDLLは共有メモリの概念で動作するため、パフォーマンスは静的リンクと比較して低くなります。
一方、.libはコンパイル時に要求するすべてのプロセスに静的にリンクされるコードです。したがって、.exe(s)は1つのメモリを持つため、プロセスのパフォーマンスが向上します。
- 1. DLLとLIBファイル
- 2. .LIBファイルと.OBJファイルの違いは何ですか? (Visual Studio C++)
- 3. ファイルusr/lib/opkg/info/initscripts.listとは何か
- 4. visual C++ 2008:.dllと.libファイルが生成されていない
- 5. ブーストコンパイルに必要なすべてのブーストDLLと.libファイルはありますか?
- 6. VS2010のリンカエラー、.dllファイルの.libファイルを探して
- 7. .libと.hファイルをPythonで使用できるDLLに変換する
- 8. DLLプロジェクトは.expと.libファイルを生成しません
- 9. DLLを使用するとアプリケーションに.libファイルが含まれる
- 10. .libファイルと逆コンパイル
- 11. リンクするためにいくつかのDLLファイルに追加の.libファイルが必要なのはなぜですか?
- 12. スタイルはdllファイルですか?
- 13. .libファイルが存在しないため、ライブラリプロジェクト(DLL)を参照できません。
- 14. ヘッダーファイルなしで.libファイルは役に立たないですか?
- 15. .NET Core 2.0 SDKのlibフォルダとrefフォルダの.DLLの違いは何ですか?
- 16. LIBとDLLの違い
- 17. なぜ "lib '〜';"を使用できないのですか? perlファイルで使われますか?
- 18. Windows用のDEFファイル形式__stdcall DLL? (* .def - > lib.exe - > * .lib)
- 19. "ShowWindow Lib"とは何ですか?
- 20. webpack umd libと外部ファイル
- 21. devenvマクロとlibファイルのコマンドラインオプション
- 22. 正しいweb-appファイル構造は何ですか?なぜ?
- 23. なぜ私のiniファイルの拡張子は何ですか?
- 24. は、delphiでlibファイルを使用します。 libファイルをインポートする方法
- 25. .dllファイルから.xmlファイルと.pdbファイルを作成する
- 26. なぜPDFファイルにLOG4JとSLF4Jが必要ですか?なぜ.Docファイルには必要ないのですか?
- 27. ハードコードのApp.Config dllファイルですか? C#
- 28. Boostのlibにhppファイルがないようですか?
- 29. gfortranを使用して.dllで.libファイルを構築するにはどうすればよいですか?
- 30. .dllファイルにアクセスできない
'.LIB'ファイルは、静的ライブラリ(オブジェクトファイルを含む)またはインポートライブラリ(リンカがDLLにリンクするためのシンボルを含む)のいずれかになります。 [私はこれがなぜであるのだろうと思っています](http://stackoverflow.com/q/6421693/269126) – Lumi
良い説明!コードは共有され、データは(デフォルトで)Dllを消費するアプリケーション間で共有されません。 – mox