Statische und dynamische / geteilte Verknüpfung mit MinGW

Ich möchte mit einer einfachen Verknüpfung beginnen, um mein Problem zu erklären. Nehmen wir an, dass es eine Bibliothek gibtz Dies könnte 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.a) kompiliert werden.

Lass mich dagegen verlinken, dann mache ich das:

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

Gemäßdiese Dokumentation, gcc würde nach libz.a suchen, was ist

Archivdateien, deren Mitglieder Objektdateien sind

Ich kann auch Folgendes tun:

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

Es wird in der Dokumentation darüber nicht erwähnt-l flag wird suchen nachlib<name>.so.

Was passiert, wenn sich libz.a und libz.dll im selben Verzeichnis befinden? Wie wird die Bibliothek mit einem Programm verknüpft? Warum ich die Fahnen brauche-Wl,-Bstatic und-Wl,-Bdynamic ob-l Sucht sowohl nach gemeinsam genutzten als auch nach statischen Bibliotheken?

Warum stellen einige Entwickler .a-Dateien mit .dll-Dateien für dieselben Module bereit, wenn ich eine gemeinsam genutzte Bibliotheksdistribution kompiliere?

Beispielsweise stellt Qt DLL-Dateien im bin-Verzeichnis und A-Dateien im lib-Verzeichnis zur Verfügung. Handelt es sich um dieselbe Bibliothek, die jedoch wie eine gemeinsam genutzte bzw. eine statische Bibliothek aufgebaut ist? Oder .a-Dateien sind eine Art Dummy-Bibliotheken, die Verknüpfungen mit gemeinsam genutzten Bibliotheken bereitstellen, in denen echte Bibliotheksimplementierungen vorhanden sind?

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

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

P.S. Hier gibt es viele Fragen, aber ich denke, jede hängt von der vorherigen ab und es besteht keine Notwendigkeit, sie in mehrere Fragen aufzuteilen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage