Wenn Sie eine Klassenbibliothek in C++ erstellen, können Sie zwischen dynamischen ( .dll
, .so
) und statisch ( .lib
, .a
) Bibliotheken. Was ist der Unterschied zwischen diesen Bibliotheken und wann ist es sinnvoll, welche zu verwenden?
Antworten
Zu viele Anzeigen?Als allgemeine Faustregel würde ich sagen, dass, wenn Sie eine große Codebasis haben, die auf Bibliotheken auf niedrigerer Ebene aufgebaut ist (z.B. ein Utils- oder Gui-Framework) und die Sie in überschaubarere Bibliotheken aufteilen wollen, dann machen Sie diese zu statischen Bibliotheken. Dynamische Bibliotheken bringen Ihnen nicht wirklich etwas und es gibt weniger Überraschungen - es gibt zum Beispiel nur eine Instanz von Singletons.
Wenn Sie eine Bibliothek haben, die vom Rest der Codebasis völlig getrennt ist (z.B. eine Bibliothek eines Drittanbieters), dann sollten Sie in Erwägung ziehen, daraus eine DLL zu machen. Wenn die Bibliothek unter der LGPL steht, müssen Sie aufgrund der Lizenzbedingungen möglicherweise ohnehin eine DLL verwenden.
Statische Bibliotheken sind Archive, die den Objektcode für die Bibliothek enthalten. Wenn sie mit einer Anwendung verknüpft werden, wird dieser Code in die ausführbare Datei kompiliert. Gemeinsame Bibliotheken unterscheiden sich dadurch, dass sie nicht in die ausführbare Datei kompiliert werden. Stattdessen durchsucht der dynamische Linker einige Verzeichnisse auf der Suche nach der/den benötigten Bibliothek(en) und lädt diese dann in den Speicher. Mehr als eine ausführbare Datei kann dieselbe gemeinsam genutzte Bibliothek gleichzeitig verwenden, was den Speicherverbrauch und die Größe der ausführbaren Datei reduziert. Allerdings müssen dann mehr Dateien mit der ausführbaren Datei verteilt werden. Sie müssen sicherstellen, dass die Bibliothek irgendwo auf dem verwendeten System installiert ist, wo der Linker sie finden kann; statisches Linken beseitigt dieses Problem, führt aber zu einer größeren ausführbaren Datei.
Abgesehen von all den Punkten, die bereits von anderen erwähnt wurden, verwende ich statische Bibliotheken in einem bestimmten Anwendungsfall:
Meine Endbenutzer sollen keinen Zugang zu einigen Allzweckbibliotheken erhalten die ich in meinem Code entwickelt habe.
Mit anderen Worten: Nehmen wir an, ich habe zwei Bibliotheken in meinem Produkt, A und B. A nutzt die Dienste von B und hängt von ihr ab. B ist jedoch eine Allzweckbibliothek mit vielen hilfreichen Diensten, die auch separat verwendet werden können. Um zu vermeiden, dass meine Endbenutzer direkt von B profitieren (sie sollten für die Lizenz bezahlen!), kompiliere ich B normalerweise als statische Bibliothek und füge sie direkt in A ein. Infolgedessen sind die Dienste von B vollständig für A reserviert und können von den Endbenutzern nicht verwendet werden.
- See previous answers
- Weitere Antworten anzeigen