Sind Abhängigkeiten von verschachtelten statischen Bibliotheken möglich?

11

Ich arbeite in QT.

  1. Kann eine statische Bibliothek von einer anderen statischen Bibliothek abhängen? (Statische Bibliothek wird durch Verknüpfen einer anderen statischen Bibliothek erstellt.)
  2. Wenn ja, ist es möglich, dass die generierte lib (lib1) nach dem Verknüpfen mit lib2 nicht alle Codes von lib2 enthält?

In meinem Qt-Projekt verwende ich eine statische Bibliothek, die von mehreren Bibliotheken abhängt. Ich musste alle Bibliotheken (mit all ihren Headern in meinem Projekt) hinzufügen, obwohl ich nur eine Bibliothek (und eine .h dieser Klasse) in meinem Code benötige.

Bitte erläutern Sie das Szenario.

sk patra
quelle

Antworten:

6

Wenn Sie etwas deklarieren, versprechen Sie nur, dass es während der Verknüpfung verfügbar und eindeutig identifiziert wird. Statische Bibliotheken sind nichts anderes als Container für Definitionen in einem Format, das außerhalb des Standards liegt. Dies hat also folgende Auswirkungen:

1) Ich verstehe nicht ganz , was Sie hier fragen, aber eine statische Bibliothek kann sehr stark von einer anderen statischen Bibliothek abhängen. Entweder versprechen Sie, dass die Definitionen dieser Bibliothek während der letzten Verknüpfungsphase Ihrer ausführbaren Datei verfügbar sind (indem Sie sie als Verknüpfungsabhängigkeit bereitstellen). Oder Sie "verschmelzen" es während der Verknüpfung der statischen Bibliothek.

2) Die Antwort darauf lautet dann, dass das einzige, was Sie tun müssen, einfach ist, während der Verknüpfung von lib1 nicht in lib2 zu verlinken.

Meiner Erfahrung nach besteht der beste Ansatz darin, nur private Bibliotheken zusammenzuführen. Der Grund dafür ist, dass Clients ansonsten auf mehrfach definierte Symbolverletzungen stoßen, wenn andere Teile ihres Projekts Abhängigkeiten mit Ihnen teilen.

Ylisar
quelle
Es bedeutet, dass eine statische Bibliothek, die von einer anderen statischen Bibliothek abhängt, aber die Verknüpfungsinformationen dieser Bibliothek enthält, MÖGLICH ist. Das heißt, wenn ich die erste Bibliothek in mein Projekt aufnehmen muss, muss ich auch die zweite einbeziehen. Bcoz, die erste Bibliothek enthält nicht ganze Codes der zweiten Bibliothek. Bin ich richtig?
Sk Patra
6

Meine kurzen zwei Punkte dazu: 10 (sorry schrecklicher Witz).

Um etwas zu erweitern, hier geht's:

1- Eine statische Bibliothek kann von einer anderen statischen Bibliothek abhängen, von nichts oder sogar von einer dynamischen Bibliothek: In den ersten beiden Fällen würde der gesamte Code für die neue statische Bibliothek in die neue SLL (Static Link Library) aufgenommen, jedoch die dritte Option , abhängig von der Umgebung, könnte dies dazu führen, dass die SLL eines der folgenden Ergebnisse erzielt:

  • Es würde statische Versionen des von ihm benötigten Codes enthalten, die aus der DLL (Dynamic Link Library) stammen.
  • oder, viel schrecklicher, Sie hätten eine statische Bibliothek, die, wenn sie in ein Projekt aufgenommen wird, den Versand mit einer DLL erforderlich macht und den gesamten Punkt der statischen Verknüpfung unterbricht.

Kurz gesagt, Sie können eine statische Bibliothek mit einer statischen Bibliothek verknüpfen

2- Wenn lib1 und lib2 beide statisch sind und lib1 mit lib2 verknüpft wurde, wäre die gesamte Funktionalität von lib2 in lib1 verfügbar, ohne dass lib2 eingeschlossen werden müsste, da lib2 statisch in lib1 verknüpft wäre (denken Sie an russische Puppen mit lib2 kleiner sein).

In dem von Ihnen beschriebenen Szenario muss in jeder der Dateien, die Sie einschließen müssen, eine diskrete Funktionalität verfügbar sein, die nicht statisch verknüpft ist. Daher sind mehrere Dateien erforderlich. Andernfalls müssten Sie eine einzelne Datei einschließen, und es wäre in Ordnung.

Nehmen Sie Folgendes: Eine .h-Datei mit Verweisen auf 6 statisch verknüpfte Bibliotheken: Sie müssten 7 Dateien in Ihr Projekt aufnehmen, um die volle Funktionalität zu erhalten

Einschlussbeispiel 1

Für eine SLL, die aus dieser .h-Datei erstellt wurde, muss nur die neue SLL zum Verknüpfen bei der Kompilierung enthalten sein:

Einschlussbeispiel 2

Hoffe das hilft und dass ich verstanden habe was du gefragt hast.

GMasucci
quelle