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?Eine ausgezeichnete Diskussion zu diesem Thema finden Sie in dieser Artikel von Sun.
Er geht auf alle Vorteile ein, einschließlich der Möglichkeit, zwischengeschaltete Bibliotheken einzufügen. Weitere Einzelheiten zum Einfügen von Bibliotheken finden Sie in dieser Artikel hier .
Wirklich der Kompromiss, den Sie (in einem großen Projekt) machen, ist in der anfänglichen Ladezeit, die Bibliotheken werden irgendwann verknüpft werden, die Entscheidung, die getroffen werden muss, ist die Verknüpfung lange genug, dass der Compiler in den sauren Apfel beißen muss und es im Voraus tun, oder kann der dynamische Linker es zur Ladezeit tun.
Wenn Ihre Bibliothek von mehreren ausführbaren Dateien gemeinsam genutzt werden soll, ist es oft sinnvoll, sie dynamisch zu machen, um die Größe der ausführbaren Dateien zu verringern. Ansonsten sollten Sie sie auf jeden Fall statisch machen.
Die Verwendung einer DLL hat mehrere Nachteile. Es entsteht zusätzlicher Overhead durch das Laden und Entladen der Datei. Außerdem gibt es eine zusätzliche Abhängigkeit. Wenn Sie die DLL so ändern, dass sie mit Ihren ausführbaren Programmen nicht mehr kompatibel ist, werden diese nicht mehr funktionieren. Wenn Sie hingegen eine statische Bibliothek ändern, sind Ihre kompilierten ausführbaren Programme, die die alte Version verwenden, davon nicht betroffen.
Wenn die Bibliothek statisch ist, wird der Code zum Zeitpunkt der Verknüpfung mit Ihrer ausführbaren Datei verknüpft. Dadurch wird Ihre ausführbare Datei größer (als wenn Sie den dynamischen Weg wählen).
Wenn die Bibliothek dynamisch ist, werden zur Link-Zeit Verweise auf die erforderlichen Methoden in die ausführbare Datei eingebaut. Dies bedeutet, dass Sie Ihre ausführbare Datei und die dynamische Bibliothek ausliefern müssen. Sie sollten auch bedenken, ob der gemeinsame Zugriff auf den Code in der Bibliothek sicher ist, und unter anderem die bevorzugte Ladeadresse.
Wenn Sie mit der statischen Bibliothek leben können, verwenden Sie die statische Bibliothek.
Wir verwenden in unserem Projekt eine Vielzahl von DLLs (> 100). Diese DLLs sind voneinander abhängig und deshalb haben wir uns für das dynamische Linking entschieden. Dies hat jedoch die folgenden Nachteile:
- Langsames Hochfahren (> 10 Sekunden)
- DLL's mussten versioniert werden, da Windows Module aufgrund der Eindeutigkeit der Namen lädt. Selbst geschriebene Komponenten würden sonst die falsche Version der DLL erhalten (d.h. die bereits geladene statt des eigenen verteilten Satzes)
- Optimierer kann nur innerhalb der DLL-Grenzen optimieren. Zum Beispiel versucht der Optimierer, häufig verwendete Daten und Code nebeneinander zu platzieren, aber das funktioniert nicht über DLL-Grenzen hinweg
Vielleicht wäre es besser, wenn man die alles eine statische Bibliothek (und daher haben Sie nur eine ausführbare Datei). Dies funktioniert nur, wenn keine Code-Duplikation stattfindet. Ein Test scheint diese Annahme zu unterstützen, aber ich konnte kein offizielles MSDN-Zitat finden. Also zum Beispiel 1 Exe machen mit:
- exe verwendet shared_lib1, shared_lib2
- shared_lib1 use shared_lib2
- shared_lib2
Der Code und die Variablen von shared_lib2 sollten nur einmal in der endgültigen, zusammengefassten ausführbaren Datei vorhanden sein. Kann jemand diese Frage beantworten?