2011-11-21 19 views
11
  1. 'msvcr XXXの.dll' と 'msvcp XXXの.dll' の目的は何ですか?そして、msvc rとmsvc pの違いは何ですか?
  2. 非常に単純で管理されていない.dllの場合、なぜ私のバイナリにリンクする必要がありますか?それはリンカの一部なのでしょうか?どうしてWindowsシステムディレクトリにデフォルトで共通のライブラリとして入っていないのですか?

私はちょうどWindowsで非常に複雑代がある理由を理解しようとしています....アンマネージドコードで再配布可能なパッケージが必要なのはなぜですか? (msvcp100.dll)

答えて

27

msvcrXXXX.dllは、CランタイムライブラリのDLLです。 msvcpXXXX.dllは、C++ランタイムライブラリのDLLです。あなたは新しいC++プロジェクトを作成すると、Visual Studioで指定されたデフォルト値である、/ MDまたは/ MDDを使用して構築している場合は

一つまたはこれらの依存関係の両方を自分のバイナリに追加されます。これらのフラグのいずれかを使用すると、プログラムをDLLバージョンのC/C++ランタイムにリンクさせることができます。あなたは、プロジェクトのプロパティ - >構成プロパティ - > C/C++ /コード生成/ランタイムライブラリの下にデフォルト値を変更することができます。

/MTまたは/ MTdを使用するようにプロジェクトを変更すると、C/C++ランタイムがプログラムに直接リンクされるため、アプリケーションは上記のいずれかのDLLへの参照を生成しません。ほとんどの単純なプログラムでは、これは問題を引き起こすことはありません。しかし、あなたのプログラムはすべて、これらのフラグを使用して構築されているいくつかのDLLに分割されている場合、各DLLは、参照CRT関数と静的データのコピーを維持し、あなたが問題を解放/メモリ割り当てに動作する可能性があります。これらを回避するには、特定のDLL内に割り当てられたオブジェクトも同じモジュールで解放されていることを確認する必要があります。

一般に、複数のモジュール(DLL)を持つアプリケーションでは、/ MDおよび/ MDdフラグを使用する方が効率的です。これらのモジュールはすべて、C/C++ランタイムライブラリの1つのコピーと、アプリケーション・プロセス内のデータ構造。単純な単一のモジュールアプリケーションの場合

、しかし、/ MTまたは/ MTdにを使用して構築して自由に感じます。

+1

良い説明。 –

関連する問題