web-dev-qa-db-ja.com

静的ライブラリ、静的にリンクされた動的ライブラリ、動的にリンクされた動的ライブラリの.libファイルには何がありますか?

静的ライブラリ、静的にリンクされた動的ライブラリ、および動的にリンクされた動的ライブラリの.libファイルの内部には何がありますか?

動的にリンクされた動的ライブラリに.libファイルが必要ないのはなぜですか。また静的リンクに.libファイルは、すべてのメソッドを備えた.objファイルにすぎません。あれは正しいですか?

75
Sulla

静的ライブラリの場合、.libファイルにはライブラリのすべてのコードとデータが含まれます。その後、リンカは必要なビットを識別し、最終的な実行可能ファイルに配置します。

動的ライブラリの場合、.libファイルには、ライブラリからエクスポートされた関数とデータ要素のリスト、およびそれらがどのDLLから来たかに関する情報が含まれます。リンカが最終実行可能ファイルをビルドする場合ライブラリの関数またはデータ要素のいずれかが使用されると、リンカーはDLL(Windowsによって自動的にロードされる原因となる)への参照を追加し、実行可能ファイルのインポートテーブルにエントリを追加します。関数の呼び出しがそのDLLにリダイレクトされること。

ダイナミックライブラリを使用するために.libファイルは必要ありませんが、ダイナミックライブラリがなければ、DLLの関数をコード内の通常の関数として扱うことはできません。代わりにLoadLibrary DLL(および完了したらFreeLibrary)をロードし、GetProcAddressはDLL内の関数またはデータ項目のアドレスを取得します返されたアドレスを使用するには、適切な関数へのポインタにキャストする必要があります。

126

ここでは、Hansの answer が役立つことがわかりました。2種類のlibファイルが存在する可能性があることを明確にしています。

LIBファイルはプログラムのビルドに使用され、ビルドマシン上にのみ存在し、出荷しません。 2種類あります。静的リンクライブラリは、単一のファイルに収集された.objファイルのバッグです。リンカは、外部識別子を解決する必要がある場合、ファイルからコードのチャンクを選択します。

ただし、DLLにより関連性の高いLIBファイルはインポートライブラリにもなります。これは、DLLの名前とDLLによってエクスポートされたすべての関数のリストを含む単純な小さなファイルです。プログラムをビルドするときにリンカーに提供する必要があります。 DLLを使用するので、外部識別子が実際にDLLによってエクスポートされた関数であることを認識します。リンカはインポートライブラリを使用して、EXEのインポートテーブルにエントリを追加します。実行時にWindowsによって使用され、プログラムを実行するためにどのDLLをロードする必要があるかを判断します。

12
irsis

静的ライブラリのlibファイルには、ライブラリが提供する機能の実際のオブジェクトコードが含まれています。共有バージョン(静的にリンクされた動的ライブラリと呼ばれるもの)には、実行時に動的リンクを確立するのに十分なコードがあります。

「プログラムにロードされた」「動的にリンクされた動的ライブラリ」についてはわかりません。その場合、.libとリンクしますか?

編集:

少し遅れましたが、いや、.libをリンクしません。さて、libraryloaderexを含むlibにリンクします。しかし、実際に使用しているライブラリについては、C関数ポインターを介して独自のバインディングを提供し、loadlibraryがそれらを埋めます。

概要は次のとおりです。

リンクǁ静的| DLL | LoadLibrary 
 =========ǁ============== | ======= =============== | =================== 
 APIコードǁ DLL | DLL 
に存在するǁパイリングされたプログラム| | 
 ---------ǁ---------- ----- | ---------------------- | ----------------------------------- ____。 ------------ | ---------------------- | -------------- ----- 
 BurdenǁCompiler | Compiler/OS | You/OS 
7
Cogwheel

Libファイルはリンカーによって読み取られ、実行中にdllファイルが使用されます。 libファイルは実行中は本質的に役に立たず、リンカはreading dllファイルを使用できません(ここでは無関係な方法を除きます)。

静的リンクと動的リンクでのlibファイルの使用の違いは紛らわしいかもしれませんが、少しの歴史を理解すれば非常に明確になります。

もともとは静的ライブラリのみでした。静的ライブラリの場合、.libファイルにはobjファイルが含まれます。各objファイルは、唯一のコンパイラソースコード入力ファイルの出力です。 libファイルは、ディレクトリにobjファイルを置くのと同じように、関連するobjファイルの単なるコレクションです。これは基本的にlibファイル、つまりobjファイルのライブラリです。静的リンクの場合、実行可能ファイルが使用するすべてのobjファイルが1つのファイルに結合されます。それを、実行可能ファイルが使用する他のコードとは別のファイルにあるダイナミックリンクと比較してください。

動的リンクを実装するために、Microsoftはlibファイルの使用を変更して、objファイル内の場所ではなくdllファイルを参照するようにしました。それ以外は、静的リンクのライブラリにあるすべての情報は、動的リンクの場合と同じです。それらは、ダイナミックリンクのlibファイルがdllファイルを指定することを除いて、それらの情報に関する限りすべて同じです。

5
user34660

Dllにはexeのような「もの」があります(あらゆる種類のデータ、インポート、エクスポート、読み取り/書き込み/実行可能セクションがあります)が、exeファイルはエントリポイント(関数)のみをエクスポートしますが、dllのエクスポートは/多くの機能。

1
Quonux