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
istArchivdateien, 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.
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