2012-08-30 42 views
16

私の背景はC#ですが、私はいくつかのレガシー(MS)C++を維持する必要があります。そのコードベースでは、私は次のように打ち明けました。C++:#pragma comment(lib、 "XXX")は実際に "XXX"と何をするのですか?

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

ここで、700はバージョン管理の一部です。 libに加えて、同じ名前のDLLがあります。

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

プログラムがlibのコードを '含む'ように見えるので、もはや外部DLLに依存しなくなりました。 (または「自動的に」新しいDLLを使用するプログラム...)

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

+3

間違った答えを受け入れるために下落しました。 – rustyx

答えて

3

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

+0

はい700は通常はバージョン管理されますが、ウィンドウは完全一致を検索し、同じ名前のより高いバージョンのライブラリをロードしようとしません。 – drescherjm

+0

他のlibがインポートライブラリかスタティックライブラリかどうかはどのようにわかりますか? 静的なコードは 'my'プログラムに含まれていますか? – steglig

+1

私は、以下の答えは、違いを伝える方法を説明していると信じています:http://stackoverflow.com/questions/6402586/know-if-lib-is-static-or-import – drescherjm

33

そのpragmaは、指定された.libファイルとのリンクに使用されます。これは、プロジェクト設定の外部依存関係フィールドでライブラリを指定する代わりに使用されます。

ほとんどが、それは別のバージョンをサポートするために使用されます:アプリケーションが動的にリンクされたライブラリを使用する場合

#ifdef USE_FIRST_VERSION 
#pragma comment(lib, "vers1.lib") 
#else 
#pragma comment(lib, "vers2.lib") 
#endif 

libファイルはあなたのシンボルがdllに輸出されているかについての情報を伝えます。したがって基本的にをコンパイルするには&リンクが必要ですが、すべてのバイナリコードが含まれているので、プログラムを実行するにはdllが必要です。

dllがあります。通常、libファイルにはリンク情報のみが含まれており、コードは含まれていないことを示しています。関連付けられたdllが見つからない場合は、実行時エラーが発生するはずです。 dllの異なるバージョンがロードされているか、別の場所からロードされているかどうかをMSVSで確認できます。

+0

* "libをコンパイルしてリンクするだけです" * .. libはヘッダファイル(.h)の代わりのように使うことができますか? – Acidic

-2

.libが実際のコードを持つ "本物の" libの場合(私はシステム提供のDLLを使用したことはありませんが、自分のDLL用に 'import libs'を作ったと思います) DLLは必要ありません。

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

+2

「本当の」libとは何ですか? –

+0

私は彼が "静的な"ライブラリを意味すると思います。 – moala