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?Erstellen einer statischen Bibliothek
$$:~/static [32]> cat foo.c
#include<stdio.h>
void foo()
{
printf("\nhello world\n");
}
$$:~/static [33]> cat foo.h
#ifndef _H_FOO_H
#define _H_FOO_H
void foo();
#endif
$$:~/static [34]> cat foo2.c
#include<stdio.h>
void foo2()
{
printf("\nworld\n");
}
$$:~/static [35]> cat foo2.h
#ifndef _H_FOO2_H
#define _H_FOO2_H
void foo2();
#endif
$$:~/static [36]> cat hello.c
#include<foo.h>
#include<foo2.h>
void main()
{
foo();
foo2();
}
$$:~/static [37]> cat makefile
hello: hello.o libtest.a
cc -o hello hello.o -L. -ltest
hello.o: hello.c
cc -c hello.c -I`pwd`
libtest.a:foo.o foo2.o
ar cr libtest.a foo.o foo2.o
foo.o:foo.c
cc -c foo.c
foo2.o:foo.c
cc -c foo2.c
clean:
rm -f foo.o foo2.o libtest.a hello.o
$$:~/static [38]>
Erstellung einer dynamischen Bibliothek
$$:~/dynamic [44]> cat foo.c
#include<stdio.h>
void foo()
{
printf("\nhello world\n");
}
$$:~/dynamic [45]> cat foo.h
#ifndef _H_FOO_H
#define _H_FOO_H
void foo();
#endif
$$:~/dynamic [46]> cat foo2.c
#include<stdio.h>
void foo2()
{
printf("\nworld\n");
}
$$:~/dynamic [47]> cat foo2.h
#ifndef _H_FOO2_H
#define _H_FOO2_H
void foo2();
#endif
$$:~/dynamic [48]> cat hello.c
#include<foo.h>
#include<foo2.h>
void main()
{
foo();
foo2();
}
$$:~/dynamic [49]> cat makefile
hello:hello.o libtest.sl
cc -o hello hello.o -L`pwd` -ltest
hello.o:
cc -c -b hello.c -I`pwd`
libtest.sl:foo.o foo2.o
cc -G -b -o libtest.sl foo.o foo2.o
foo.o:foo.c
cc -c -b foo.c
foo2.o:foo.c
cc -c -b foo2.c
clean:
rm -f libtest.sl foo.o foo
2.o hello.o
$$:~/dynamic [50]>
Eine statische Bibliothek wird in den Client kompiliert. Eine .lib wird zur Kompilierzeit verwendet und der Inhalt der Bibliothek wird Teil der konsumierenden ausführbaren Datei.
Eine dynamische Bibliothek wird zur Laufzeit geladen und nicht in die ausführbare Client-Datei kompiliert. Dynamische Bibliotheken sind flexibler, da mehrere ausführbare Client-Programme eine DLL laden und ihre Funktionen nutzen können. Dadurch werden auch die Gesamtgröße und die Wartbarkeit Ihres Client-Codes auf ein Minimum reduziert.
Eine statische Bibliothek muss in die endgültige ausführbare Datei eingebunden werden; sie wird Teil der ausführbaren Datei und folgt ihr auf Schritt und Tritt. Eine dynamische Bibliothek wird jedes Mal geladen, wenn die ausführbare Datei ausgeführt wird, und bleibt als DLL-Datei von der ausführbaren Datei getrennt.
Sie würden eine DLL verwenden, wenn Sie die von der Bibliothek bereitgestellten Funktionen ändern möchten, ohne die ausführbare Datei neu verlinken zu müssen (ersetzen Sie einfach die DLL-Datei, ohne die ausführbare Datei ersetzen zu müssen).
Sie würden eine statische Bibliothek verwenden, wenn Sie keinen Grund haben, eine dynamische Bibliothek zu verwenden.
Sie sollten sorgfältig über Änderungen im Laufe der Zeit, Versionierung, Stabilität, Kompatibilität usw. nachdenken.
Wenn es zwei Anwendungen gibt, die den gemeinsamen Code verwenden, möchten Sie diese Anwendungen zwingen, sich gemeinsam zu ändern, falls sie miteinander kompatibel sein müssen? Dann verwenden Sie die dll. Alle Exe-Programme werden denselben Code verwenden.
Oder wollen Sie sie voneinander trennen, so dass Sie eine ändern können und sicher sein können, dass Sie die andere nicht beschädigt haben. Dann verwenden Sie die statische Bibliothek.
DLL-Hölle ist, wenn Sie wahrscheinlich eine statische Lib verwendet haben SOLLTE, aber Sie verwendet eine DLL statt, und nicht alle Exes sind kompatibel mit ihm.
Ulrich Dreppers Arbeit über " Wie man gemeinsam genutzte Bibliotheken schreibt " ist auch eine gute Ressource, die detailliert beschreibt, wie man am besten die Vorteile von gemeinsam genutzten Bibliotheken nutzt, oder was er als "Dynamic Shared Objects" (DSOs) bezeichnet. Er konzentriert sich mehr auf gemeinsam genutzte Bibliotheken in der ELF Binärformat, aber einige Diskussionen sind auch für Windows-DLLs geeignet.