2013-04-06 11 views
22

Ich möchte mit einer einfachen Verknüpfung starten, um mein Problem zu erklären. Nehmen wir an, dass es eine Bibliothek z gibt, die in die gemeinsam genutzte Bibliothek libz.dll (D: /libs/z/shared/libz.dll) oder in die statische Bibliothek libz.a (D:/libs/z/static/libz) kompiliert werden könnte .ein).Statisch und Dynamisch/Shared Linking mit MinGW

Let möchte ich dagegen verbinden, dann das ich tun:

gcc -o main.exe main.o -LD:/libs/z/static -lz 

Nach this documentation, gcc für libz.a suchen würde, die

ist

Archivdateien, deren Mitglieder Objekt Dateien

ich kann auch wie folgt vorgehen:

gcc -o main.exe main.o -LD:/libs/z/shared -lz 

In der obigen Dokumentation wird nicht erwähnt, dass -l Flag nach lib<name>.so suchen wird.

Was passiert, wenn ich libz.a und libz.dll im selben Verzeichnis sein wird? Wie wird die Bibliothek mit einem Programm verknüpft? Warum brauche ich die Flags -Wl,-Bstatic und -Wl,-Bdynamic wenn -l sowohl nach freigegebenen als auch nach statischen Bibliotheken sucht?

Warum einige Entwickler .a-Dateien mit .dll-Dateien für die gleichen Module bereitstellen, wenn ich eine freigegebene Bibliotheksverteilung kompiliere?

Zum Beispiel stellt Qt .dll-Dateien im bin-Verzeichnis mit .a-Dateien im lib-Verzeichnis bereit. Ist es die gleiche Bibliothek, aber gebaut wie geteilt und statisch? Oder .a-Dateien sind eine Art Dummy-Bibliotheken, die eine Verknüpfung mit Shared Libraries ermöglichen, wo es echte Bibliotheksimplementierungen gibt?

Ein anderes Beispiel ist OpenGL-Bibliothek unter Windows. Warum muss jeder Compiler die statische OpenGL-Lib wie libopengl32.a in MingW bereitstellen?

Wofür werden Dateien mit den Erweiterungen .dll.a und .la verwendet?

P.S. Es gibt viele Fragen hier, aber ich denke, jeder hängt von dem vorherigen ab und es besteht keine Notwendigkeit, sie in mehrere Fragen aufzuteilen.

+0

Nehmen wir das Cygwin-Beispiel: Es ist mein Verständnis, dass Programme, die mit Cygwin kompiliert werden, eine bestimmte DLL benötigen, um zu laufen. Die DLL ist an eine bestimmte Lizenz (eine der freien Lizenzen) gebunden und muss auf dem Host-System für das Programm vorhanden sein. Wenn Sie als Entwickler vergessen, es zusammen mit dem Programm zu versenden, wird das Programm nicht ausgeführt. Ein anderes Beispiel sind Versionskonflikt-DLLs (dh opengl). Jedes System hat unterschiedliche Fähigkeiten und daher unterschiedliche Implementierungen bestimmter DLLs. Manchmal verwenden die Entwickler die richtige Bibliotheksversion => static linked. – scones

Antwort

23

Bitte schauen Sie sich ld and WIN32 (cygwin/mingw) an. Vor allem die direkte Verknüpfung zu einem dll Abschnitt für weitere Informationen über das Verhalten von -l Flag auf Windows-Ports von LD. Auszug:

Wenn zum Beispiel ld mit dem Argument aufgerufen wird -Lxxx es im ersten Verzeichnis der Suchpfad zu finden versucht,

libxxx.dll.a 
xxx.dll.a 
libxxx.a 
cygxxx.dll (*) 
libxxx.dll 
xxx.dll 

bevor er zum nächsten Verzeichnis zu bewegen in der Suchpfad Eigentlich

(*), ist dies nicht cygxxx.dll aber in der Tat ist <prefix>xxx.dll, wo <prefix>-dll-search-prefix=<prefix> durch die ld Option eingestellt ist. Im Falle von Cygwin enthält die Standard-GCC-Spezifikationsdatei -dll-search-prefix=cyg, so dass wir tatsächlich nach cygxxx.dll suchen.

HINWEIS: Wenn Sie jemals-Boost mit MinGW gebaut haben, erinnern Sie sich wahrscheinlich, dass die Benennung der Boost-Bibliotheken genau das Muster in den Link oben beschriebenen gehorcht.

In der Vergangenheit gab es Probleme in MinGW mit direkter Anbindung an *.dll, so wurde stattdessen eine statische Bibliothek lib*.a mit exportierten Symbolen von *.dll und Link gegen sie zu schaffen beraten. Der Link zu dieser MinGW-Wiki-Seite ist jetzt tot, also nehme ich an, dass es in Ordnung sein sollte, jetzt direkt gegen *.dll zu verlinken. Außerdem habe ich es selbst mehrmals mit der neuesten MinGW-w64-Distribution gemacht und hatte bis jetzt keine Probleme.

Sie benötigen Link Flaggen -Wl,-Bstatic und -Wl,-Bdynamic weil manchmal will man statische Linken zwingen, zum Beispiel, wenn die dynamische Bibliothek mit dem gleichen Namen in einem Suchpfad auch vorhanden ist:

gcc object1.o object2.o -lMyLib2 -Wl,-Bstatic -lMyLib1 -Wl,-Bdynamic -o output 

Die oben genannten Schnipsel Garantien dass die Standardverknüpfungspriorität des -l Flags für MyLib1 überschrieben wird, dh selbst wenn MyLib1.dll im Suchpfad vorhanden ist, wählt LD libMyLib1.a für die Verknüpfung aus. Beachten Sie, dass LD für MyLib2 wieder die dynamische Version bevorzugt.

HINWEIS: Wenn MyLib2 auf MyLib1 abhängt, dann MyLib1 dynamisch zu verbunden ist, und zwar unabhängig von -Wl,-Bstatic (das heißt es wird in diesem Fall ignoriert). Um dies zu verhindern, müssten Sie auch MyLib2 statisch verbinden.