7

MS Visual C++ ランタイム ライブラリには何が含まれていますか? つまり、私はそれをグーグルで検索しましたが、常にヘルプのようなものを見つけました.app xxxxは、説明なしでMS Visual C++ランタイムライブラリエラーを表示します.

Windows C ランタイム ライブラリは Windows に付属していると思いましたか? VC++ ではありませんか? ありがとう。

編集:まず、答えてくれてありがとう。私は今、Windowsのランタイムライブラリについて悪い考えを持っています。つまり、最初の部分では、Windows が内部的に win32 API を持っているので、それはわかっていました。また、その Win32API はカーネルお​​よびユーザー部分からのものです。

しかし、私は常に、GDI のような関数は DLL としてアクセスされると考えていました (今でもそう信じています)。printfしかし、いくつかのWindowsファイルには や のような機能もあると思いました。

だから、私が知っているとき、「単純な」関数はprintf直接リンクする必要があり、OS のカーネル部分のみを直接使用する必要がなく、より洗練された Windows API 関数は dll としてリンクされているため、コンパイラで配布されていませんが、 OSと?その後、カーネルにアクセスしますか?

つまり、GDIに絵を描くように指示すると、ユーザーモードですべてのハードワークが行われ、すべてをフレームバッファに入れるカーネル関数を呼び出すよりも?

そして最後に考えたのは、なぜこれがこのように解決されるのでしょうか? つまり、VC++ ランタイムが C と WinAPI の間のレイヤーにすぎない場合、なぜ VC++ は直接 WinAPI を呼び出せないのでしょうか?

4

4 に答える 4

6

これは単純化しすぎていますが、要点がわかります。MSVCRT は、C++ 言語の一部を実装する DLL のセットです。printfなどの関数memcpyがこれらの DLL に実装されています。

特定のコンパイラでコンパイルされ、C++ ランタイムに動的にリンクされるすべてのプログラムは、何らかの方法でターゲット コンピューターに正しいバージョンの CRT バイナリを持っている必要があります。その結果、エンド ユーザーに出荷されるアプリケーションは、多くの場合 (通常は?)、これらの DLL のパッケージと共に出荷されます。このパッケージは「再配布可能」(または「再配布」) と呼ばれ、正確なコンパイラ バージョンとターゲット プラットフォームの組み合わせごとに異なるパッケージがあります。たとえば、次のそれぞれについて個別の個別の redist があります。

  • MSVC 10、64 ビット Windows
  • MSVC 10、32 ビット ウィンドウ
  • MSVC9、64 ビット ウィンドウ
  • MSVC9 SP1、64 ビット Windows

など。

はい、Windows には通常、CRT のいくつかのバージョンが "付属" しています。ただし、Windows に同梱されているアプリを実行するために必要なバージョンが付属しています。Windows とそのすべてのアプリが MSVC8 SP2 でコンパイルされ、アプリが MSVC10 でコンパイルされている場合、Windows を実行しているため、必要な CRTボックスに表示されません。

これが、アプリを redist と共に出荷するという一般的な慣行である理由です。

編集:

Houdini の魔法のように、次の質問は「再編集はどこで入手できますか?」ということになると思います。

答えは、マイクロソフトからです。「msvc 9 x64 redist」をグーグルで検索してみてください。

http://www.microsoft.com/downloads/en/details.aspx?familyid=bd2a6171-e2d6-4230-b809-9a8d7548c1b6&displaylang=en

于 2010-11-17T22:29:56.570 に答える
2

簡単な答えは、MSVS C/C++ ランタイムは、malloc/free、stdio、iostream などの関数と、dynamic_cast や例外処理などのいくつかの c++ 要素を実装しているということです。これらは Visual Studio のバージョンによって異なるため、バージョンごとに異なるランタイムがあります。

Windows には、ほとんどの場合、C/C++ 標準ライブラリとはかなり異なる C API (Win32 API) が付属しています。MSVS C/C++ ランタイムは、この API を呼び出してメモリなどを割り当てます。

(Windows に含まれるアプリケーションの一部は MSVS および C++ で作成されていると思われるため、そのバージョンの MSVS ランタイムが含まれています。)

また、新しい Visual Studio バージョンがリリースされると、ランタイムが変更されます。Windows のリリースはそれよりもずっと長く続きます。

于 2010-11-17T22:24:27.973 に答える
2

Visual C++ でコンパイルされたプログラムには「ランタイム」が必要です。これは、アプリケーションの起動/シャットダウン、メモリの割り当て/割り当て解除、ファイルの読み取りと書き込みのサポートなどを処理するコードです。

これはオペレーティング システムの一部ではなく、最終的なアプリケーションの一部でもありません。すべての C++ アプリケーションで共有できるため、デフォルトでは、ランタイムは個別にインストールされます。

さらに、Visual C++ の各バージョンには、独自のランタイム インストーラーがあります。これは、バージョンごとに、これらすべての動作にわずかな違いと改善があるためです。プラットフォームごとに異なるバージョンのランタイムもあります (例: x86 と x64)。

したがって、Microsoft から入手できる "Visual Studio XXXX ランタイム インストーラー (YYY)" のダウンロードが多数あります。ここで、XXXX は Visual Studio のバージョン (2005、2008、2010 など) であり、YYY は通常 "x86" または "x64" です。 "。

ランタイムを必要とするほとんどのアプリケーションは、必要に応じてランタイムを自動的にインストールするため、通常、エンド ユーザーはこれらの再配布可能ファイルについてあまり認識していません。

于 2010-11-17T22:25:53.323 に答える
2

C および C++ の標準ライブラリ関数を実装するライブラリです。などの標準機能printfがこれらのライブラリに実装されています。

コア Windows ライブラリは、システム コールへのインターフェイス、つまりWin32 APIのみを提供します。これは、フル機能の Windows アプリケーションを構築するために必要なすべてであるためです。glibcVC++ ライブラリは、ほとんどがこの API のラッパーであり、Linuxのライブラリに似ています。

例として、mallocC ライブラリから、VirtualAllocAPI を使用してメモリを割り当てることができます。

于 2010-11-17T22:26:18.133 に答える