web-dev-qa-db-ja.com

C ++:#pragma comment(lib、 "XXX")は実際に "XXX"で何をしますか?

私の背景はC#ですが、レガシー(MS)C++を維持する必要があります。そのコードベースでは、私は次のように行き詰まりました:

#pragma comment(lib, "OtherLib700.lib")

700はバージョン管理です。 libに加えて、同じ名前のDLLです。

プログラムはDLLに依存するが、システムから削除した後でもプログラムは動作します。ただし、OtherLib900という名前の新しいバージョンのDLLが存在します。 。

プログラムがlibのコードを「インクルード」して、外部DLLに依存しなくなったようです。 (または、プログラムが新しいDLLを「自動的に」使用すること...)

どちらが正しいか? 「仮定」をさらに確認する方法はありますか?

28
steglig

プログラムにこのプラグマがある場合、ライブラリOtherLib700.libを探します。プログラムが読み込まれたときにインポートライブラリである場合、ウィンドウはパスでOtherLib700.dllを検索します。実行中にOtherLib900.dllを探しようとしないため、別のフォルダーでdllを見つける必要があります。これは、OtherLib700.libが静的ライブラリではなくインポートライブラリであることを前提としています。 OtherLib700.libが静的ライブラリである場合、必要なのはそれだけです。

6
drescherjm

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で確認できます。

49
Luchian Grigore