16
  1. 「 msvcrXXX.dll」および「msvcpXXX.dll」目的は何ですか?そして、 msvcrとmsvcp違いは何ですか?
  2. 非常に単純で管理されていない.dllの場合、なぜそれらをバイナリにリンクする必要があるのですか?リンカーの一部だからですか?共通ライブラリとしてデフォルトでWindowsシステムディレクトリにないのはなぜですか?

私は、Windowsになぜこれほど複雑なものがあるのか​​を理解しようとしています。

4

1 に答える 1

36

msvcrXXXX.dllは、CランタイムライブラリのDLLです。msvcpXXXX.dllは、C++ランタイムライブラリのDLLです。

/MDまたは/MDdを使用してビルドしている場合、これらの依存関係の一方または両方がバイナリに追加されます。これらは、新しいC++プロジェクトを作成するときにVisualStudioによって指定されるデフォルトです。これらのフラグのいずれかを使用すると、プログラムをDLLバージョンのC /C++ランタイムにリンクする必要があることを示します。デフォルトは、[プロジェクトのプロパティ]->[構成のプロパティ]->[C / C++/コード生成/ランタイムライブラリ]で変更できます。

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

一般に、複数のモジュール(DLL)を持つアプリケーションには/MDフラグと/MDdフラグを使用する方が効率的です。これらのモジュールはすべて、C /C++ランタイムライブラリとそれに関連するデータ構造の単一のコピーを共有するためです。アプリケーションプロセス。

ただし、単純な単一モジュールアプリケーションの場合は、/MTまたは/MTdを使用して自由にビルドできます。

于 2011-11-21T18:38:38.867 に答える