522 Stimmen

Wann sollten dynamische und wann statische Bibliotheken verwendet werden?

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?

16voto

Vijay Punkte 62277

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]>

15voto

Jordan Parmer Punkte 34210

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.

15voto

spotcatbug Punkte 329

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.

15voto

Corey Trager Punkte 21897

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.

9voto

Void Punkte 3351

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X