33

アプリケーションのライブラリの一部が msvcrt.dll に動的に依存している場合、アプリケーションと共に msvcrt.dll を再配布し、プライベート DLL を使用する必要がありますか? つまり、システムの msvcrt.dll (dll 地獄) との非互換性の問題はありますか? アプリケーションは、Windows Server システムを対象としています。

4

4 に答える 4

33

msvcrt - Microsoft Visual C++ ランタイムの動的ライブラリです。

Windows で C ランタイムを使用するには、次の 2 つのオプションがあります。

  1. 静的ランタイム ライブラリとリンクします。またはオプションを cl.exeに
    使用します。この場合、msvcrt DLL に依存しないため、再配布する必要はありません。Visual Studio でプロジェクトまたはソリューションを右クリックし、[プロパティ] > [C/C++] -> [コード生成] -> [ランタイム ライブラリ]でそれぞれマルチスレッドおよびマルチスレッド デバッグを使用します。これはより簡単な方法です。欠点は、結果の実行可能ファイルが大きくなることです。/MT/MTd

  2. 動的 C ランタイム ライブラリとリンクします。またはオプションを cl.exe
    に使用します。 Visual Studio で、プロジェクトまたはソリューションを右クリックし、[プロパティ] > [C/C++] -> [コード生成] -> [ランタイム ライブラリ] で、マルチスレッド ダイナミック リンクマルチスレッド ダイナミック リンク デバッグをそれぞれ使用します。これにより EXE が小さくなりますが、アプリケーションのインストール時に必要な MSVCRT をインストールする必要があるという欠点があります。 /MD/MDd


VC++ コンパイラの各リリースには、C ランタイム (CRT) のバージョンが付属しています。Visual Studio 2005 には、v8 のコンパイラと v8 の CRT が付属しています。v8 の実際の DLL は msvcrt80.dll でした。VS2008 の場合は v9 で、動的 CRT は msvcrt90.dll でした。ただし、CRT は C/C++ コンパイラよりも頻繁に更新され、パッチが適用されます。開発者は、更新された CRT をダウンロードして、それに対してビルドできます。

動的 CRT ライブラリを使用してコンパイルする場合は、必要なバージョンのランタイムの再頒布可能パッケージを microsoft.com からダウンロードし、アプリのインストール中に (場合によってはサイレント) インストールを実行する必要があります。


VS2005 より前は、開発者は、Windows オペレーティング システムに含まれていた MSVCRT に依存するアプリを作成していました。これにより、アプリケーションのインストールで CRT DLL を出荷する必要がなくなり、DLL (小さいイメージ サイズ) の利点が得られます。Windows 2000 より前は、開発者は新しい MSVCRT.dll を \Windows インストール フォルダにインストールしていました。しかし、多くのアプリや OS で CRT を共有することは、非常に悪い考えであることが判明しました。WinXP SP2 では、Windows に含まれる CRT が大幅に変更され、そのバージョンの CRT に依存するアプリは壊れる危険性がありました。

この時点で、Microsoft は開発者に、Windows に含まれている MSVCRT.dll は OS の一部であり、いつでもサービスまたはパッチが適用される可能性があることを伝えています。それに対してアプリを構築することはサポートされていません。したがって、アプリケーションは上記のいずれかの方法を使用する必要があります。

参考文献:

于 2009-07-02T11:11:52.963 に答える
26

アプリケーションと共に msvcrt を出荷する必要があります。これは、オペレーティング システムの保証された部分ではありません。Windows の特定のバージョンにそれがある場合、それは Windows の何かがそれを使用しているためです。

新しいバージョンの Windowsに、Windows に付属していると人々が想定していたバイナリが含まれていなかったため、アプリケーションは機能しなくなりました。ユーザーが WinFax をインストールしないことを選択すると、アプリケーションが壊れました。これは、msvcrt がインストールされていないことを意味します。

レイモンド・チェン より:

実行している Windows のバージョンによっては、正式な製品コンポーネントではなく、単なる乗り物用のさまざまなサポート DLL が存在する場合があります。

...

この問題は今日も続いています。人々は、Windows に付属するバイナリを探し回って、取り消すことができるものを探しています。そして、それらのバイナリが変化したり、完全に消失したりすると、彼らは驚きます。

KB326922 から - Visual C++ での共有 C ランタイム コンポーネントの再配布:

... CRT DLL はもはやシステム ファイルとは見なされないため、CRT DLL に依存するすべてのアプリケーションと共に CRT DLL を配布します。これはもはやシステム コンポーネントではないため、他のアプリケーション固有のコードと共にアプリケーションの Program Files ディレクトリにインストールしてください。これにより、アプリケーションは、システム パスにインストールされている可能性のある CRT ライブラリの他のバージョンを使用できなくなります。

MSVCRT にリンクする場合は、アプリケーションと共に msvcrt を出荷する必要があります。

もっと

断念し、オペレーティング システム DLL として宣言し、オペレーティング システム コンポーネントのみが使用できるようにするという決定が下されました。

MSVCRT.DLL長い間オペレーティング システムの DLL であり、アプリケーションへの立ち入り禁止として文書化されてきましたが、依然としてC ランタイム配信チャネルとして扱う人が多く、それらのプログラムは多くの悲しみを生み出しています。製品チーム。

Windows には Microsoft Visual C ランタイムが同梱されていないため、アプリケーションと共に Microsoft Visual C ランタイムを再配布する必要があります。呼び出される DLLが存在する可能性がありますmsvcrt.dll(これは保証されません)。これは MSVCRT ではありませ

于 2009-07-02T11:46:15.793 に答える
12

クリスの答えは両方とも正しいので、却下されるべきではありません。

問題は、MSVCRTの2つの異なるセットがあるということです。1つのセットは、Visual Studioに付属しているmsvcrt80.dll、msvcrt90.dllなどです。これは人々が通常使用するものです。そして、他の回答で話されているように、それらは再配布されなければなりません。

もう1つは、System32フォルダー内のmsvcrt.dll(ファイル名に番号が含まれていない)です。これは、しばらく前からOS自体によってのみ使用されることを目的としています。また、アプリケーションで置き換え/再インストールしないでください。ただし、インストールする余分な依存関係を削除するなどの理由で、一部のアプリケーションはそれにリンクします。ただし、将来のWindowsバージョンで使用できるとは限らないことに注意してください。

于 2010-05-07T02:45:11.593 に答える
5

msvcrt.dll は、OS ディストリビューションの事実上の一部になっています。Windows 98 と 95、そしておそらく NT4 では、WordPad などのアプリをインストールから取り除くように気をつければ、それなしで OS をインストールすることができました。

しかし、その遍在性と、これらの OS 以降、少なくとも Windows 2000 以降は OS の正式な一部であり、わざわざ出荷するアプリ開発者がほとんどいないという事実を考えると.

Microsoft サポートには、DLL が同梱されている製品を再確認するために使用できるツールがあります。

このような検索を実行すると、msvcrt.dll vsrsion 7.0.3790.0 が Windows Server 2003 リリースの一部であることがわかります。

于 2009-07-02T11:03:48.703 に答える