28

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

システム全体で libc を共有するだけでなく、なぜ Windows プログラムは C ライブラリを一緒に持ち込まなければならないのでしょうか?


更新: Shog9 のおかげで、DLL リンケージの問題 (DLL Hell) に目を向ける SxS について読み始めました - http://blogs.msdn.com/b/martynl/archive/2005/10/ 13/480880.aspxは、この問題の便利な紹介です...

4

4 に答える 4

18

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

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

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

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

于 2008-11-06T07:17:51.337 に答える
15

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

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

Windows では、物事はより断片化されています。コンパイラは OS に付属していないため、各自で入手する必要があります。各コンパイラは独自の CRT を提供します。これには、MSVCRT と同じ機能がある場合とない場合があります。また、呼び出し規則やライブラリでの名前の表示方法に関する 1 つの真の仕様も存在しないため、コンパイラが異なれば (処理方法も異なります)、ライブラリ内の関数を見つけるのに問題が生じる可能性があります。

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

于 2011-06-22T15:08:46.353 に答える
11

Short answer? Because, up until SxS, MSVCRT was not reliably versioned! Can you imagine the madness that would result if programs compiled and tested against libc 5 would silently start using libc 6? That's the situation we were in for many years on Windows. Most of us would just as soon never again trust MS with keeping breaking changes out of a version

于 2008-09-25T19:09:13.997 に答える
3

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

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

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

于 2008-09-25T19:07:43.093 に答える