Soll ich einen Link zu der Visual Studio C-Laufzeit statisch oder dynamisch?

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

  •  16-09-2019
  •  | 
  •  

Frage

Ich habe Argumente auf beiden Seiten zu lesen, ob man auf die C-Laufzeitbibliothek verknüpfen sollte statisch oder dynamisch in Visual Studio-Projekten, und ich bin immer noch nicht ganz sicher, was ich denken soll.

Ihr Projekt zieht in einigen Bibliotheken von Drittanbietern (Python, HDF5, trilinos und Microsoft MPI), von denen jeder mit der gleichen Laufzeitbibliothek als meine letzte ausführbare Datei erstellt werden muss (sonst können sie zusammen nicht verbunden). Wenn statische Verknüpfung, wird jede dieser Bibliotheken eine Kopie der C-Laufzeit enthalten. Ich habe gelesen, dass dieser haftet Probleme verursachen, weil die endgültige ausführbare mehrere Kopien der Laufzeit, von denen keines enthalten können miteinander in Wechselwirkung treten. Aber wäre nicht der Linker beschweren, wenn die gleichen Symbole wurden mehrfach definiert?

Ich mag „DLL Hell“ vermeiden, aber mach mir Sorgen um heimtückische Fehler, die von statisch Verknüpfung in mehreren Kopien der Laufzeit entstehen könnten. Bin ich etwas falsch?

Lesen

Auch ich bin mit Visual Studio 2005 und ich lese, dass das Service Pack 1 Laufzeit nicht rückwärtskompatibel ist. Bedeutet dies, dass eine App ohne SP1 gebaut werden nicht auf einem Computer ausführen, der die SP1-DLLs hat, auch wenn sie den gleichen Namen haben (z msvcr80.dll)?

War es hilfreich?

Lösung

statisch Verknüpfung wird alle Ihre EXE-Dateien und DLLs aufblasen und Abstürze verursachen kann (z. B. wenn der Code in einer DLL ruft free () mit einem Zeiger von malloc () in einer anderen DLL).

Sie können das Beste aus beiden Welten erhalten, indem dynamisch verknüpfen und den Runtime-DLLs als private Assemblys bereitstellen. Dies bedeutet einfach, eine Kopie eines speziell genannten Verzeichnis setzen die Runtime-DLLs und ihre Manifeste neben ausführbare Datei enthält.

finden Sie im Abschnitt "Bereitstellen von Visual C ++ Bibliothek DLLs als private Baugruppen" unter http://msdn.microsoft.com/en-us/library/ms235291 (VS.80) aspx für Details, aber im Grunde Ihre Anwendung wie folgt aussieht:

c:\Program Files\My App\MyApp.exe
c:\Program Files\My App\MyLibrary.dll
c:\Program Files\My App\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
c:\Program Files\My App\Microsoft.VC80.CRT\msvcr80.dll

In Bezug auf Ihre letzte Frage, ja, die Zielmaschine die richtigen Versionen des Runtime-DLLs benötigt, zu arbeiten, aber von ihnen als privaten Assemblys bereitstellen, Sie, dass gewährleisten.

Ein weiterer Vorteil ist, dass Nicht-Admin-Benutzer Ihre App installieren kann (nicht in Program Files, aber an anderer Stelle.) - sie haben keine Berechtigung, um Dateien in den WinSxS Bereich zu schreiben

Andere Tipps

Das einzige Mal, wenn Sie mehrere Kopien der Laufzeit erhalten werden, wenn Sie statisch eine Bibliothek in eine DLL verknüpfen - jede DLL eine Kopie bekommen, und so wird die exe. Wenn sie alle statische Bibliotheken und nicht den DLLs, werden sie alle Links zusammen und alle Bibliotheken die gleiche Laufzeit teilen.

Das ist die Aufgabe des Linkers.

... Do it statisch ... versucht DLL-Hölle zu beheben hat nicht so gut funktioniert ... nur ein extra 200k auf Ihre Installation mit der statischen Verknüpfung hinzuzufügen.

Statische Bibliotheken BMW verbaut werden ohne statisch zu anderen statischen Bibliotheken verknüpft werden. Sie müssen nur alle statischen Bibliotheken in Ihrem Hauptprojekt verknüpfen. Auf diese Weise wird der Compiler nicht über mehrere Symbole beschweren.

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