Windows での MSVCRT は、*nix での glibc (libc) と似ていますか?

StackOverflow https://stackoverflow.com/questions/135296

  •  02-07-2019
  •  | 
  •  

質問

私は、MSVCRT (または最新の同等のプログラム) にプログラムの実行可能ファイルがバンドルされている Windows プログラムを頻繁に見かけます。一般的な PC では、同じ .DLL のコピーが多数見つかります。私の理解では、MSVCRT は C ランタイム ライブラリであり、*nix の glibc/libc.so にいくらか似ています。

なぜ Windows プログラムは、システム全体の libc を共有するのではなく、C ライブラリを一緒に持ち込む必要があるのでしょうか?


アップデート:Shog9 のおかげで、SxS について読み始めました。これにより、DLL リンケージの問題 (DLL Hell) についてさらに目が開かれました。 http://blogs.msdn.com/b/martynl/archive/2005/10/13/480880.aspx この問題への有益な入門書です...

役に立ちましたか?

解決

[私は現在、Microsoft でネイティブ SxS テクノロジのメンテナを務めています]

MSVCRT の新しいバージョンは、Visual Studio の新しいバージョンとともにリリースされ、C++ ツールセットへの変更が反映されます。Windows の特定のバージョンが継続した後にリリースされた VS のバージョンでコンパイルされたプログラムがダウンレベルで動作できるように (Windows XP 上の VS 2008 プロジェクトなど)、MSVCRT は再配布可能であるため、そこにインストールできます。

CRT をインストールすると、ライブラリが %windir%\winsxs\ (グローバル システムの場所) にドロップされるため、これには管理者権限が必要です。

一部のプログラムは、インストーラーを同梱したくない、またはユーザーがインストーラーを実行するためにマシンの管理者権限を必要としないため、私的使用のためにアプリケーションと同じディレクトリに CRT を直接バンドルします。したがって、一般的なマシンでは、このソリューションを選択したプログラムが数多く見つかります。

他のヒント

Windows には実際には「システム全体の libc」はありません。

*nix には通常、1 つのコンパイラー、1 つのリンカーがあり、それらには明確に定義されたオブジェクト ファイル形式、呼び出し規約、および名前マングリング仕様が含まれます。通常、これは OS に付属しています。コンパイラーの準特殊ステータス (さらに、異なる *nix 間での移植性を重視) は、特定のものを 期待される そこに存在し、プログラムが簡単に見つけて使用できるように名前やバージョンが付けられている必要があります。

Windows では、物事はさらに細分化されています。コンパイラは OS に付属していないため、独自のコンパイラを入手する必要があります。各コンパイラは独自の CRT を提供しますが、MSVCRT と同じ機能を備えている場合と備えていない場合があります。また、呼び出し規約やライブラリ内で名前がどのように表示されるかに関する唯一の True Spec がないため、異なるコンパイラ (処理方法が異なる) では、ライブラリ内の関数を見つけるのに苦労する可能性があります。

ところで、ここでは名前がヒントになるはずです。MSVCRT は「MicroSoft Visual C++ RunTime」の略です。これは、実際には、たとえば次のような「システム全体の」ライブラリではありません。 kernel32 それは -- MS のコンパイラによって使用される単なるランタイム ライブラリであり、おそらく Windows を構築するときに使用されたものと思われます。他のコンパイラもこれにリンクする可能性がありますが、(1) ライセンスの問題がある可能性があります。(2) コンパイラは自社のコードを MS のコードに結びつけることになる -- つまり、(2a) MS がバグを修正してくれることを期待する以外に、ランタイムに追加したりバグを修正したりする方法がなくなる。(2b) MS が RTL の内容を変更することを決定した場合 (これは自由に変更でき、おそらく VC++ の新しいバージョンごとに変更されているでしょう)、または名前の表示方法を変更すると、他のプログラムが壊れる可能性があります。

短い答え?なぜなら、SxS までは MSVCRT 確実にバージョン管理されていなかった!libc 5 に対してコンパイルおよびテストされたプログラムが、黙って libc 6 の使用を開始した場合に生じる狂気を想像できますか?これが Windows で長年にわたって私たちが陥っていた状況です。私たちのほとんどは、バージョンに重大な変更を加えないという MS をすぐに二度と信頼できなくなるでしょう

プログラムはランタイムの特定のバージョンに対してリンクされており、その必要なバージョンは ない ターゲット マシン上に存在することが保証されます。また、以前はバージョンの一致にも問題がありました。

Windows の世界では、アプリケーションを使用するためにユーザーがわざわざ別のライブラリを探してインストールすることを期待するのは非常にマナー違反です。ホスト システムの一部ではない依存関係がアプリに含まれていることを確認します。

Linux の世界では、ホスト システムの外観にははるかに大きなバリエーションがあるため、これは必ずしも単純ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top