静的ライブラリ、静的にリンクされたダイナミックライブラリ、動的にリンクされたダイナミックライブラリの.libファイルには何が含まれていますか?
動的にリンクされたダイナミックライブラリに.libファイルが必要ないのはなぜですか。また、静的リンクでは、.libファイルはすべてのメソッドを含む.objファイルにすぎません。あれは正しいですか?
回答:
静的ライブラリの場合、.libファイルにはライブラリのすべてのコードとデータが含まれています。次に、リンカは必要なビットを識別し、それらを最終的な実行可能ファイルに入れます。
ダイナミックライブラリの場合、.libファイルには、ライブラリからエクスポートされた関数とデータ要素のリスト、およびそれらがどのDLLから取得されたかに関する情報が含まれています。リンカが最終的な実行可能ファイルをビルドするときに、ライブラリの関数またはデータ要素のいずれかが使用されると、リンカはDLLへの参照を追加し(Windowsによって自動的にロードされるようにします)、実行可能ファイルのインポートテーブルにエントリを追加します。関数の呼び出しがそのDLLにリダイレクトされること。
ダイナミックライブラリを使用するために.libファイルは必要ありませんが、.libファイルがないと、DLLの関数をコード内の通常の関数として扱うことはできません。代わりに、手動で呼び出しLoadLibrary
てDLLをロードし(FreeLibrary
完了したら)、GetProcAddress
DLL内の関数またはデータ項目のアドレスを取得する必要があります。次に、返されたアドレスを使用するために、適切な関数ポインタにキャストする必要があります。
ハンスからの次の回答もここで役に立ちました。2種類のlibファイルが存在する可能性があることは明らかです。
LIBファイルはプログラムのビルドに使用されます。LIBファイルはビルドマシンにのみ存在し、出荷されません。2種類あります。静的リンクライブラリは、1つのファイルに収集された.objファイルのバッグです。リンカは、外部識別子を解決する必要があるときに、ファイルからコードのチャンクを選択します。
ただし、DLLとの関連性が高いため、LIBファイルをインポートライブラリにすることもできます。これは、DLLの名前と、DLLによってエクスポートされたすべての関数のリストを含む単純な小さなファイルです。DLLを使用するプログラムをビルドするときにリンカーに提供する必要があります。これにより、外部識別子が実際にはDLLによってエクスポートされた関数であることがわかります。リンカは、インポートライブラリを使用して、EXEのインポートテーブルにエントリを追加します。次に、Windowsが実行時にこれを使用して、プログラムを実行するためにロードする必要のあるDLLを特定します。
静的ライブラリでは、libファイルにはライブラリによって提供される関数の実際のオブジェクトコードが含まれています。共有バージョン(静的にリンクされたダイナミックライブラリと呼ばれるもの)には、実行時にダイナミックリンケージを確立するのに十分なコードがあります。
「動的にリンクされたダイナミックライブラリ」(プログラムでロードされる)についてはよくわかりません。その場合、.libとリンクすることさえありますか?
編集:
少し遅れていますが、いいえ、.libをリンクしていません。さて、あなたはその中にlibraryloaderexを含むlibにリンクします。ただし、使用している実際のライブラリについては、C関数ポインタを介して独自のバインディングを提供し、loadlibraryがそれらを埋めます。
要約は次のとおりです。
リンクǁ静的| DLL | LoadLibrary =========ǁ=============== | ====================== | = ================== APIコードǁあなたのcom- | DLL内| DLL内 生活ǁ積み上げプログラム| | ---------ǁ--------------- | ---------------------- |- ------------------ 機能ǁ直接、可能性があります| テーブル経由の間接| あなたを介して間接 呼び出しǁは省略されます| 自動的に入力| 独自の関数ptrs ---------ǁ--------------- | ---------------------- |- ------------------ 負担ǁコンパイラ| コンパイラ/ OS | あなた/ OS
libファイルはリンカーによって読み取られ、実行中にdllファイルが使用されます。libファイルは実行中は本質的に役に立たず、リンカーはdllファイルを読み取ることができません(ここで無関係な方法を除いて)。
静的リンクと動的リンクでのlibファイルの使用の違いは紛らわしいかもしれませんが、少し歴史を理解すれば、それは非常に明確になります。
もともと静的ライブラリしかありませんでした。静的ライブラリの場合、.libファイルにはobjファイルが含まれます。各objファイルは、1つだけのコンパイラソースコード入力ファイルの出力です。libファイルは、objファイルをディレクトリに配置するのと同じように、関連するobjファイルの単なるコレクションです。それは本質的にlibファイル、objファイルのライブラリです。静的リンクの場合、実行可能ファイルが使用するすべてのobjファイルが1つのファイルに結合されます。これを、実行可能ファイルが使用する他のコードとは別のファイルにある動的リンクと比較してください。
ダイナミックリンクを実装するために、Microsoftはlibファイルの使用を変更して、objファイル内の場所ではなくdllファイルを参照するようにしました。それ以外は、静的リンクのライブラリにあるすべての情報は、動的リンクの場合と同じです。ダイナミックリンクのlibファイルがdllファイルを指定することを除いて、それらの情報に関する限り、それらはすべて同じです。