私の背景はC#ですが、レガシー(MS)C++を維持する必要があります。そのコードベースでは、私は次のように行き詰まりました:
#pragma comment(lib, "OtherLib700.lib")
700はバージョン管理です。 libに加えて、同じ名前のDLLです。
プログラムはDLLに依存するが、システムから削除した後でもプログラムは動作します。ただし、OtherLib900という名前の新しいバージョンのDLLが存在します。 。
プログラムがlibのコードを「インクルード」して、外部DLLに依存しなくなったようです。 (または、プログラムが新しいDLLを「自動的に」使用すること...)
どちらが正しいか? 「仮定」をさらに確認する方法はありますか?
プログラムにこのプラグマがある場合、ライブラリOtherLib700.lib
を探します。プログラムが読み込まれたときにインポートライブラリである場合、ウィンドウはパスでOtherLib700.dll
を検索します。実行中にOtherLib900.dll
を探しようとしないため、別のフォルダーでdll
を見つける必要があります。これは、OtherLib700.lib
が静的ライブラリではなくインポートライブラリであることを前提としています。 OtherLib700.libが静的ライブラリである場合、必要なのはそれだけです。
pragma
は、指定された.lib
ファイル。これは、プロジェクト設定の外部依存関係フィールドでライブラリを指定する代わりの方法です。
ほとんどの場合、異なるバージョンをサポートするために使用されます。
#ifdef USE_FIRST_VERSION
#pragma comment(lib, "vers1.lib")
#else
#pragma comment(lib, "vers2.lib")
#endif
アプリケーションが動的にリンクされたライブラリを使用する場合、lib
ファイルは、dll
でエクスポートされるシンボルに関する情報を示します。したがって、基本的には、コンパイルとリンクにはlib
のみが必要ですが、バイナリコードがすべて含まれているため、プログラムの実行にはdll
が必要です。
関連するdll
があると言います。通常、これはlib
ファイルがリンク情報のみを含み、コードを含まないことを示します。関連するdll
が見つからなかった場合は、実行時エラーが発生するはずです。異なるバージョンのdll
がロードされたかどうか、または異なる場所からロードされたかどうかをMSVSで確認できます。