web-dev-qa-db-ja.com

リンク:.a、.lib、.defファイル

GNU binutilsを使用して、Windows上のアセンブリからDLLを構築しています。

Dllは、実行可能ファイルが読み込まれたとき、または実行時に(LoadLibrary api呼び出しを使用して)読み込まれることを知っています。

ロード時のロードでは、dllファイルのみが必要なようです。a、.lib、.defファイルは必要ありません。これらのファイル形式が何を表し、どのような目的に役立つのか疑問に思いました。

私が知っていることといくつかの特定の質問:

  • .aは、Unixの静的ライブラリで一般的に使用される拡張子です。 .aファイルは、GNU ldの -out-implib オプションを使用して生成されます。十分に公平な「インポートライブラリ」と呼ばれています。質問は次に、「リンク時にインポートライブラリが必要ない場合、インポートライブラリはどのように役立ちますか?」

  • .libは、Windowsの静的ライブラリに使用される拡張子であり、ウィキペディアによれば、Windowsの「インポートライブラリ」としても使用されるため、binutilsが.aファイルを呼び出すための別の名前にすぎないと私は強く思います。真/偽 ?

  • .defファイルがdllのエクスポートされたシンボルをリストするポイントを見つけることができるすべてのページ。これは、「インポートライブラリ」が行うことになっていることと多少似ていませんか?

  • また、私は here を読みました。defファイルを使用することは、ソースファイルでエクスポートを手動で指定する代わりに使用することです(私はそうしました)。ただし、エクスポートされたシンボルにインデックス( ordinal )を指定して.defファイルを読み取る(参照が見つからない)ことを覚えているので、実行時の読み込みを高速化できます。そうですか ?

29
Norswap

Linuxの静的ライブラリには、.aファイル拡張子が付いています。 Windowsの静的ライブラリには、.libファイル拡張子が付いています。 Windowsの動的ライブラリには.dll拡張子があります。 DLLにリンクするには、インポートライブラリが必要です。インポートライブラリは静的ライブラリです。 DLLをロードするために必要なコードが含まれています。これで、GCC(cl.exeではない)を使用してWindowsでコンパイルするようになりました。 GCCには、インポートライブラリ用の別のファイル拡張子規則があります。これは、参照した doc for the --out-implib で説明されているように、「*。dll.aまたは* .a」と呼ばれる必要があります。

インポートライブラリ(.lib with MSVCまたは.dll.a with GCC)are静的ライブラリ:DLLをロードするコードが含まれています。 先日同じ質問がありました。

A DLLには、エクスポートされる関数とエクスポートされない関数がある場合があります。インポートライブラリは、エクスポートされる関数とエクスポートされない関数を認識している必要があります。それを伝える手段の1つはDEFです。ファイル。

DLLをビルドするとき、リンカーは.defファイルを使用して、エクスポート(.exp)ファイルとインポートライブラリ(.lib)ファイルを作成します。次に、リンカーはエクスポートファイルを使用してDLLファイルをビルドします。DLLに暗黙的にリンクする実行可能ファイルは、ビルド時にインポートライブラリにリンクします。- MSDN:aからのエクスポートDLL DEFファイルの使用

MSDN:関数のエクスポートDLL名前ではなく序数による も一緒に参照してください)と一緒に、インデックスまたは序数によるエクスポートに関する最後の質問に答える必要があります。

51
Lumi