0

私が使用しているライブラリについて、次のことに気付きました。

  • ライブラリは.libファイルにコンパイルされます。
  • このライブラリにリンクするには、コードをマルチスレッド (デバッグ) DLLとしてコンパイルする必要があります。

ライブラリの.sln (ソリューション) ファイル (オープン ソース) を開くと、プロジェクト プロパティに次のように表示されます。

  1. Runtime LibraryオプションはMulti-threaded (Debug) DLLに設定されています。
  2. 構成タイプ静的ライブラリ (.lib)に設定されています

私の混乱は次のとおりです。

  1. 上記のライブラリ オプションに矛盾はありませんか? (静的ライブラリは 1 つのオプションを示し、DLL は別のオプションを示します)
  2. 動的にリンクされる.libとはどのような動物ですか? DLLとの違いは何ですか?

Linux の世界では、静的ライブラリと動的ライブラリの違いを認識していることに注意してください。

4

3 に答える 3

3

「RunTime Library」オプションは、あなたのライブラリに関するものではありません。実行時に関数をインポートすることをコンパイラに伝えMSVCRTxx.DLLます。

「構成タイプ」オプションはライブラリを参照するため、「ランタイム ライブラリ」オプションとは無関係です。

于 2010-02-12T12:19:23.350 に答える
2

Windows DLLは、LoadLibrary (またはLoadLibraryEx)APIを使用して動的にロードできますが、 GetProcAddressまたはGetProcAddressExを使用して、エクスポートされた各関数を検索し、関数ポインターにバインドする必要があります。いつものように、関数のシグネチャを正しく取得するか、悪いことが起こります。

LIBファイルを使用すると、EXEの起動時にWindowsですべてのことを実行でき(使用するDLLの検索、依存DLLの再帰的な読み込みなど)、実行時にダイナミックライブラリを静的にリンクし、実行可能コードでEXEファイルが肥大化するのを防ぎます。 、および複数のプロセスがメモリ内の同じDLLイメージを共有できるようにします。

于 2010-02-12T12:29:39.003 に答える
1

構成の不一致についてはわかりませんが、.DLLライブラリで作成された.LIBファイルは「エクスポートライブラリ」です。コードは含まれていませんが、DLL内の呼び出し可能な関数とオブジェクトの名前だけが含まれています。 。リンカはこれを使用して、実行時の動的ロードによって最終的に解決されるリンク時の参照を満たします。

于 2010-02-12T11:45:18.113 に答える