Frage

Bereits in den 90er Jahren, als ich anfing, mit MFC I verwenden dynamisch meine apps und versendet den entsprechenden MFC-DLLs zu verknüpfen. Dies führte mir ein paar Probleme (DLL Hölle!) Und ich wechselte statisch statt zu verknüpfen - nicht nur für MFC, aber für die CRT und ATL. Anders als größere EXE-Dateien, die Verknüpfung hat statisch veranlaßte mich nie irgendwelche Probleme - so gibt es irgendwelche Nachteile, die andere Leute über gekommen sind? Gibt es einen guten Grund für die erneuten Besuch dynamische Verknüpfung wieder? Meine Apps sind in erster Linie STL / Boost-heutzutage FWIW.

War es hilfreich?

Lösung

Es gibt einige Nachteile:

  • Bigger exe Größe
  • (insbesondere, wenn Sie mehr exe versenden)
  • Probleme andere DLL verwendet, die verlassen oder übernehmen eine dynamische Verbindung (zB: 3rd-Party-DLL, die Sie nicht als statische Bibliotheken erhalten können)
  • Verschiedenes c-Runtimes zwischen DLL mit unabhängiger statischer Bindung (kein Quer Modul Zuweisen / Frei)
  • Keine automatische Wartung von gemeinsam genutzten Komponenten (keine Möglichkeit, 3rd-Party-Modullieferanten haben ihren Code aktualisieren Probleme zu beheben, ohne neu zu kompilieren und die Aktualisierung Ihre Anwendung)

Wir tun statisch Linken für unsere Windows-Anwendungen, vor allem weil es xcopy Einsatz ermöglicht, die mit der Installation oder unter Berufung auf SxS DLL in eine Art und Weise einfach nicht möglich ist, das funktioniert, da der Prozess und Mechanismus ist nicht gut dokumentiert oder leicht Remotable. Wenn Sie lokale DLL verwenden in dem Verzeichnis installiert es irgendwie funktioniert, aber es ist nicht gut unterstützt. Die Unfähigkeit, leicht Remote-Installation zu tun, ohne auf dem Remote-System über ein MSI zu gehen ist der Hauptgrund, warum wir keine dynamische Verknüpfung verwenden, aber (wie Sie wies darauf hin,) gibt es viele andere Vorteile für die statische Linken. Es gibt Vor-und Nachteile jeder; hoffentlich hilft ihnen aufzuzählen.

Andere Tipps

Die meisten der Antworten, die ich über diese hören Ihre DLL mit anderen Programmen beinhalten teilen, oder solche mit DLL ohne die Notwendigkeit, die Software zu patchen aktualisiert werden.

Ehrlich gesagt halte ich diese Nachteile sein, nicht upsides. Wenn ein Dritter DLL aktualisiert wird, kann es genug ändern, um Ihre Software zu brechen. Und in diesen Tagen, ist Festplattenspeicher nicht so wertvoll wie es einmal war, ein extra 500k in die ausführbare Datei? Wen interessiert das?

  • Die 100% sicher von der Version von DLL, die Ihre Software ist eine gute Sache.
  • Das zu 100% sicher, dass der Kunde keine Abhängigkeit Kopfschmerzen haben wird ist eine gute Sache.

Die upsides überwiegen bei weitem die Nachteile meiner Meinung nach

Solange Sie Ihre Nutzung behalten beschränkt auf bestimmte Bibliotheken und verwenden Sie keine DLL, dann sollten Sie gut sein.

Leider gibt es einige Bibliotheken, die Sie nicht statisch verknüpfen. Das beste Beispiel, das ich habe, ist OpenMP. Wenn Sie die Vorteile von Visual Studio OpenMP-Unterstützung nehmen, müssen Sie die Laufzeit stellen Sie sicher installiert ist (in diesem Fall vcomp.dll).

Wenn Sie das tun DLL verwenden, dann können Sie nicht einige Elemente hin und her, ohne einige ernsthafte Gymnastik passieren. std :: strings in den Sinn kommen. Wenn Sie Ihre EXE-und DLL dynamisch verknüpft sind, dann erfolgt die Zuordnung in der CRT platzieren. Andernfalls kann das Programm versuchen, die Zeichenfolge auf der einen Seite zuzuordnen und es auf der anderen Seite freigeben. Bad Dinge folgen ...

Das heißt, ich immer noch statisch meine exe und DLL verknüpfen. Es macht eine Menge der variablilty im Installations reduzieren, und ich denke, dass es lohnt sich die paar Einschränkungen.

Eine gute Eigenschaft von DLL verwendet werden, wenn mehrere processess lädt die gleiche DLL seinen Code zwischen ihnen geteilt werden können. Dies kann Speicher sparen und die Ladezeiten für eine Anwendung verkürzt eine DLL laden, die bereits von einem anderen Programm verwendet wird.

Nein, nichts Neues an dieser Front. Halten Sie es auf diese Weise.

Auf jeden Fall.

Die Zuordnung erfolgt auf einem ‚statischen‘ Haufen getan. Da Zuteilung sollte eine Freigabe auf dem gleichen Haufen getan werden, bedeutet dies, dass, wenn Sie eine Bibliothek versenden, sollten Sie darauf achten, dass Client-Code nicht nennen kann ‚Ihre‘ p = new LibClass() und löscht das Objekt selbst delete p; verwendet wird.

Mein Fazit: entweder Schild Zuweisung und Freigabe von Client-Code, oder dynamisch verknüpft die CRT

.

Es gibt einige Softwarelizenzen wie LGPL, die Sie benötigen entweder eine DLL verwenden oder Ihre Anwendung als Objektdateien zu verteilen, dass der Benutzer miteinander verknüpfen kann. Wenn Sie eine solche Bibliothek verwenden, werden Sie wahrscheinlich es als DLL verwenden möchten.

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