48

C++Visual Studio で簡単なアプリケーションを作成しています。また、セットアップ プロジェクトもあります。私の開発マシンでは問題なく動作しますが、このアプリケーションをユーザーのマシンにインストールするときはVisual C++ Redistributable Package. 私のアプリケーションがなぜ必要なのC++ Redistributableですか? 標準C++のランタイム ライブラリは Windows に同梱されていますね。

4

2 に答える 2

58

ほとんどの 32 ビット Windows バージョンで Microsoft から出荷される C ランタイム ライブラリの唯一のバージョンは、msvcrt.dll. このライブラリは、C および C++ プログラムで必要なライブラリ関数の典型的なセットを提供します。これらには、文字列操作、メモリ割り当て、C スタイルの入出力呼び出しなどが含まれます。

Visual Studio 6.0 のコンパイラはこのライブラリにリンクしているため、VS 6.0 で開発している場合、ほとんどのユーザーのマシンで問題が発生することはありません。

ただし、VS 2005、VS 2008、VS 2010、VS 2012、VS 2013、または VS 2015 で開発している場合は、アプリケーションと共に追加の C ランタイム ライブラリを配布する必要があります。これは、Windows に同梱されていない 、 、 、 、および に対してコンパイラがそれぞれmsvcrt80.dllリンクmsvcrt90.dllmsvcrt100.dllmsvcrt110.dllいるmsvcrt120.dllためです。msvcrt140.dll

ソリューション:

  1. .exe考えられる解決策は、ランタイム ライブラリと静的にリンクすることですが、アプリケーションにとの両方がある場合、多くの問題が発生する可能性があり.dllます。そうしないでください

    より具体的には、この回答の一部を引用することを許可します。

    EXE だけでなく DLL も作成する場合、/MT の使用は危険です。プログラム内に CRT の複数のコピーが作成されることになります。これは特に、各 CRT が独自のヒープを取得する以前のバージョンの VS では問題でしたが、VS2012 ではそれほど問題ではありませんでした。しかし、たとえば、複数の "errno" 変数がある場合、いまだにランタイムの問題が発生する可能性があります。このような損失を避けるために、/MD を使用することを強くお勧めします。

  2. もう 1 つの考えられる解決策は、適切な Microsoft Visual C++ 再頒布可能パッケージをユーザーのマシンにインストールするよう要求することです。

    これは、セットアップ プロジェクトの前提条件プロパティでこの要件を指定することによって実行できます。

  3. dllまた、セットアップ プロジェクトに適切な「マージ モジュール」を含めることで、ランタイムを配布することもできます。この場合、不適切なランタイム バージョンによるエラーを回避するために、適切な「ポリシー マージ モジュール」を追加することを忘れないでください。

  4. 最後に、必要な DLL を、アプリケーションがインストールされているのと同じフォルダーに入れるだけです。

参考文献:

于 2013-04-23T10:42:49.910 に答える