静的ライブラリ、静的にリンクされたダイナミックライブラリ、動的にリンクされたダイナミックライブラリの.libファイルには何が含まれていますか?


84

静的ライブラリ、静的にリンクされたダイナミックライブラリ、動的にリンクされたダイナミックライブラリの.libファイルには何が含まれていますか?

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


4
質問はMSWindowsプラットフォームに関するものであることに注意してください。
cubuspl42 2015年

回答:


147

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

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

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


4
長い検索、IMOの後、私はlib&dllを使用する理由で最良の答えを得ました。ありがとう
Jeet 2016

@Anthony Williamsは、「ダイナミックライブラリの場合、.libファイルには、ライブラリからエクスポートされた関数とデータ要素のリスト、およびそれらがどのDLLからのものであるかに関する情報が含まれています。」と言ったとき、「import」と呼ばれる.libファイルです。通常の.libファイル(「静的ライブラリ」)とは異なる「ライブラリ」?
スターリエット

はい、それはインポートライブラリだ
アンソニー・ウィリアムズ

13

ハンスからの次の回答もここで役に立ちました。2種類のlibファイルが存在する可能性があることは明らかです。

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

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


8

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

「動的にリンクされたダイナミックライブラリ」(プログラムでロードされる)についてはよくわかりません。その場合、.libとリンクすることさえありますか?

編集:

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

要約は次のとおりです。

リンクǁ静的| DLL | LoadLibrary
=========ǁ=============== | ====================== | = ==================
APIコードǁあなたのcom- | DLL内| DLL内
生活ǁ積み上げプログラム| |
---------ǁ--------------- | ---------------------- |- ------------------
機能ǁ直接、可能性があります| テーブル経由の間接| あなたを介して間接
呼び出しǁは省略されます| 自動的に入力| 独自の関数ptrs
---------ǁ--------------- | ---------------------- |- ------------------
負担ǁコンパイラ| コンパイラ/ OS | あなた/ OS

静的にリンクされたライブラリとは、コンパイル時に.libファイルを使用して.dllをリンクすることを意味します。ダイナミックリンクは、Win32 APIのlibraryloaderex()関数を使用して実行時に.dllをリンクしています。
Sulla

6

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

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

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

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


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.