Frage

ich auf Windows-Programme häufig kommen, die in MSVCRT bündeln (oder der aktuellen Äquivalente) mit den Programm ausführbaren Dateien. An einem typischen PC, ich möchte viele Kopien derselben .dll finden. Mein Verständnis ist, dass MSVCRT die C-Laufzeitbibliothek ist, in gewisser Weise analog / glibc libc.so unter * nichts.

Warum Windows-Programme haben an ihren C-Bibliotheken mit ihnen zu bringen, anstatt nur die systemweite libc teilen?


Update: Dank Shog9, begann ich über SxS zu lesen, die weiter meine Augen zu den DLL-Verknüpfung Probleme (DLL Hölle) hat sich geöffnet - http://blogs.msdn.com/b/martynl/archive/2005/10/13/480880.aspx ist eine nützliche Einführung in das Thema ...

War es hilfreich?

Lösung

[Ich bin der aktuelle Betreuer der Native SxS-Technologie bei Microsoft]

Neue Versionen von MSVCRT werden mit neuen Versionen von Visual Studio veröffentlicht und spiegeln Änderungen in dem C ++ Toolset. So dass mit Versionen von VS kompilierten Programme nach einer bestimmten Version von Windows veröffentlichten weiterhin auf PC-Ebene (wie VS 2008-Projekte auf Windows XP) arbeiten, der MSVCRT verteilbar ist, so kann es dort installiert werden.

CRT Installation fällt die Bibliotheken in% windir% \ winsxs \, die ein globales System Lage ist, Administratorrechte erforderlich, dies zu tun.

Da einige Programme wollen nicht mit einem Installer versenden, oder wollen nicht den Benutzer über Administratorrechte auf dem Rechner benötigen, um ihr Installationsprogramm zu starten, sie bündeln die CRT direkt im selben Verzeichnis wie die Anwendung, für die privaten Gebrauch. So auf einer typischen Maschine, werden Sie viele Programme, die für diese Lösung entschieden haben.

Andere Tipps

Es ist nicht wirklich ein "systemweite libc" in Windows.

* nix, gibt es im Allgemeinen einen Compiler, einen Linker und mit ihnen ein wohldefiniertes Objekt-Dateiformat, Aufrufkonvention und den Namen Mangeln spec. Dieses Material kommt in der Regel mit dem Betriebssystem. Die Compiler halb Sonderstatus (plus ein Schwerpunkt auf Portabilität zwischen verschiedenen * nixes) bedeutet, dass bestimmte Dinge kann sein erwartet , um dort zu sein, und so genannt und / oder versioniert werden, dass Programme finden und verwenden sie es leicht.

In Windows sind die Dinge stärker fragmentiert. Ein Compiler kommt nicht mit dem Betriebssystem, so dass die Leute ihre eigenen bekommen müssen. Jeder Compiler stellt eine eigene CRT, die nicht oder nicht die gleichen Funktionen in ihm als MSVCRT haben. Es gibt auch keine One True Spec auf Konventionen fordern oder wie Namen in den Bibliotheken, so verschiedene Compiler (mit unterschiedlichen Arten von Sachen zu tun) haben könnten Probleme bei der Suche Funktionen in der Bibliothek angezeigt werden sollen.

BTW, sollte der Name ein Hinweis hier sein; MSVCRT ist die Abkürzung für "Microsoft Visual C ++ Runtime". Es ist nicht wirklich eine „systemweite“ Bibliothek in der gleichen Art und Weise, die, sagen wir, kernel32 ist - es ist nur die Laufzeitbibliothek von MS der Compiler verwendet, die sie vermutlich verwendet, wenn Windows zu bauen. Andere Compiler Denkbar verknüpfen dagegen, aber (1) könnte es Lizenzprobleme sein; und (2) die Compiler wären, ihren Code zu binden, um MS '- Was bedeutet: (2a), sie würden nicht mehr über jeden Weg zur Laufzeit hinzuzufügen oder Fehler zu beheben, kurz von der Hoffnung, MS wird fixieren; und (2b), wenn MS zu ändern entscheidet, was in dem RTL ist (die sie nach Belieben tun können, und wahrscheinlich in jeder neuen Version von VC hat ++), oder, wie die Namen erscheinen, die anderen Programme könnten brechen.

Kurze Antwort? Denn bis SxS, MSVCRT wurde nicht zuverlässig versioniert ! Können Sie den Wahnsinn vorstellen, die leise mit, wenn Programme kompiliert und getestet gegen libc 5 führen würde beginnen libc 6? Das ist die Situation, die wir waren in vielen Jahren auf Windows. Die meisten von uns würden so bald nur nie wieder MS vertrauen mit dem Halten brechen Änderungen von einer Version

Programme sind gegen eine bestimmte Version der Laufzeit verbunden sind, und dass erforderliche Version ist nicht auf dem Zielrechner existieren garantiert. Auch passende Versionen verwendet als problematisch.

In der Windows-Welt, ist es sehr schlechte Manieren Benutzer zu erwarten, zu gehen und finden und eine separate Bibliothek installieren, um Ihre Anwendung zu verwenden. Sie stellen sicher, dass alle Abhängigkeiten nicht Teil des Host-Systems mit Ihrer Anwendung enthalten ist.

In der Linux-Welt ist dies nicht immer so einfach, da gibt es eine viel größere Variation, wie das Host-System aussehen könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top