In Visual Studio gibt es die Kompilierungsflags / MD und / MT, mit denen Sie auswählen können, welche Art von C-Laufzeitbibliothek Sie möchten.
Ich verstehe den Unterschied in der Implementierung, bin mir aber immer noch nicht sicher, welchen ich verwenden soll. Was sind die Vor- und Nachteile?
Ein Vorteil von / MD, den ich gehört habe, ist, dass dies jemandem ermöglicht, die Laufzeit zu aktualisieren (z. B. ein Sicherheitsproblem zu beheben), und meine App von diesem Update profitiert. Obwohl mir das fast wie eine Nicht-Funktion erscheint: Ich möchte nicht, dass Leute meine Laufzeit ändern, ohne dass ich gegen die neue Version testen kann!
Einige Dinge, auf die ich neugierig bin:
- Wie würde sich dies auf die Bauzeiten auswirken? (vermutlich / MT ist etwas langsamer?)
- Was sind die anderen Implikationen?
- Welches benutzen die meisten Leute?
Antworten:
Durch dynamische Verknüpfung mit / MD,
Ich habe auch festgestellt, dass in der Praxis / MT in der Hauptanwendung bei der Arbeit mit statisch verknüpften Nur-Binär-Bibliotheken von Drittanbietern, die mit unterschiedlichen Laufzeitoptionen erstellt wurden, häufig Konflikte verursacht als / MD (weil Sie Es treten Probleme auf, wenn die C-Laufzeit mehrmals statisch verknüpft ist, insbesondere wenn es sich um unterschiedliche Versionen handelt.
quelle
/MT
, dass es zur Laufzeit etwas schneller sein wird, da Ihre App nicht jedes Mal nach der Implementierung der Laufzeitfunktion suchen muss. Ich bin kein Experte auf diesem Niveau, aber ich bin mir ziemlich sicher, dass die meisten Betriebssysteme werden die Laufzeitimplementierungen zwischenspeichern, sodass Ihre App die zwischengespeicherte Version verwendet, sodass der Unterschied nicht so weit ist. HINWEIS: Ich habe erwähnt, dass ich nicht sicher bin. Nehmen Sie diesen Kommentar also nicht als Argument.Wenn Sie DLLs verwenden, sollten Sie sich für die dynamisch verknüpfte CRT (/ MD) entscheiden.
Wenn Sie die dynamische CRT für Ihre EXE-Datei und alle DLLs verwenden, teilen sich alle eine einzige Implementierung der CRT. Dies bedeutet, dass alle einen einzigen CRT-Heap gemeinsam nutzen und der in einer EXE / DLL zugewiesene Speicher freigegeben werden kann Ein weiterer.
Wenn Sie die statische CRT für Ihre EXE-Datei und alle DLLs verwenden, erhalten alle eine separate Kopie der CRT. Dies bedeutet, dass alle ihren eigenen CRT-Heap verwenden, sodass der Speicher in demselben Modul freigegeben werden muss, in dem sie sich befinden wurde zugeteilt. Sie leiden auch unter aufgeblähtem Code (mehrere Kopien der CRT) und übermäßigem Laufzeit-Overhead (jeder Heap weist dem Betriebssystem Speicher zu, um den Status zu verfolgen, und der Overhead kann spürbar sein).
quelle
Ich glaube, der Standard für Projekte, die über Visual Studio erstellt wurden, ist / MD.
Wenn Sie / MT verwenden, hängt Ihre ausführbare Datei nicht davon ab, ob auf dem Zielsystem eine DLL vorhanden ist. Wenn Sie dies in ein Installationsprogramm einbinden, ist dies wahrscheinlich kein Problem, und Sie können in beide Richtungen vorgehen.
Ich benutze / MT selbst, damit ich das ganze DLL-Chaos ignorieren kann.
PS Wie Herr Fooz betont , ist es wichtig, konsequent zu sein. Wenn Sie mit anderen Bibliotheken verknüpfen, müssen Sie dieselbe Option verwenden, die sie verwenden. Wenn Sie eine DLL eines Drittanbieters verwenden, ist es fast sicher, dass Sie die DLL-Version der Laufzeitbibliothek verwenden müssen.
quelle
Ich verlinke lieber statisch mit / MT.
Auch wenn Sie mit / MD eine kleinere ausführbare Datei erhalten, müssen Sie dennoch eine Reihe von DLLs ausliefern, um sicherzustellen, dass der Benutzer die richtige Version zum Ausführen Ihres Programms erhält. Und am Ende wird Ihr Installer GRÖSSER sein als beim Verknüpfen mit / MT.
Was noch schlimmer ist, wenn Sie Ihre Laufzeitbibliotheken in das Windows-Verzeichnis stellen, wird der Benutzer früher oder später eine neue Anwendung mit verschiedenen Bibliotheken installieren und mit etwas Pech Ihre Anwendung beschädigen.
quelle
Das Problem, auf das Sie mit / MD stoßen, besteht darin, dass sich die Zielversion der CRT möglicherweise nicht auf dem Computer Ihres Benutzers befindet (insbesondere, wenn Sie die neueste Version von Visual Studio verwenden und der Benutzer ein älteres Betriebssystem hat).
In diesem Fall müssen Sie herausfinden, wie Sie die richtige Version auf ihren Computer bekommen.
quelle
von http://msdn.microsoft.com/en-us/library/2kzt1wy3(VS.71).aspx :
Wenn ich es also richtig interpretiere, verknüpft / MT statisch und / MD dynamisch.
quelle
Wenn Sie eine ausführbare Datei erstellen, die andere DLLs oder Bibliotheken als die Option / MD verwendet, wird dies bevorzugt, da auf diese Weise alle Komponenten dieselbe Bibliothek gemeinsam nutzen. Natürlich sollte diese Option für alle beteiligten Module übereinstimmen, dh dll / lib / exe.
Wenn Ihre ausführbare Datei keine lib oder dll verwendet, kann niemand sie aufrufen. Der Unterschied ist jetzt nicht zu groß, da der Aspekt des Teilens nicht ins Spiel kommt.
Vielleicht können Sie die Anwendung mit / MT starten, da es keinen zwingenden Grund dafür gibt, aber wenn es Zeit ist, eine Bibliothek oder DLL hinzuzufügen, können Sie sie mit der der Bibliothek / DLL in / MD ändern, was einfach ist.
quelle