40

私のバックグラウンドは C# ですが、いくつかのレガシー (MS) C++ を維持する必要があります。そのコードベースで、私はつまずいた:

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

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

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

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

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

4

3 に答える 3

72

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

于 2012-08-30T14:51:36.567 に答える
12

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

于 2012-08-30T14:57:16.800 に答える
-1

.lib が実際のコードを含む「実際の」lib である場合 (システム提供の DLL を保存するために DLL を使用したことはありませんが、独自の DLL 用に「インポート ライブラリ」を作成すると思います)、DLL はそうではありません。必要。

件名については、 #pragma comment(lib,xxx) により、プログラムはリンカーに特定のオプションを追加できます。このように追加したかったいくつかのオプションを見逃していましたが、非常に便利です。与えられた例は、その使用の代表的な例です: オブジェクトファイルがプログラムに含まれる場合、指定された lib も追加されます。

于 2012-08-30T14:51:49.770 に答える