Ich bin es leid, meinem Projekt zehn Link-Bibliotheken hinzuzufügen oder acht davon für die Verwendung meiner eigenen zu benötigen. Ich möchte vorhandene Bibliotheken wie libpng.a, libz.a, libjpeg.a nehmen und sie zu einer einzigen .a-Bibliothek kombinieren. Ist das möglich? Wie wäre es mit dem Kombinieren von .lib-Bibliotheken?
Wie kann ich mehrere C/C++-Bibliotheken zu einer kombinieren?
GhassanPL
Richter Maygarden
Sie könnten die Objektdateien aus jeder Bibliothek mit extrahieren
ar x <library name>
und führen Sie sie dann alle in einer neuen Bibliothek mit zusammen
ar cs <new library name> <list each extracted object file>
-
Dies funktioniert nicht auf allen ar. Beim Lesen des Handbuchs stellte ich fest, dass frühere Versionen von ar einfacher zu bewerkstelligen sind:
sh4-linux-ar r <existinglib.a> *.o
andere Symbole anhängenexistinglib.a
– Ed Felipe
4. August 2010 um 20:32 Uhr
-
Dies würde auch Probleme mit der Befehlszeilenlänge verursachen. Das Kompilieren von .a/.lib-Dateien wird häufig verwendet, um die WIN32-Beschränkung von 4096 Zeichen in der Befehlszeile zu umgehen (es dürfen nicht zu viele .o-Dateien gleichzeitig zum Verknüpfen oder Erstellen der Bibliothek vorhanden sein).
– whitey04
17. August 2011 um 20:22 Uhr
-
Beachten Sie, dass, wenn zwei Ihrer Bibliotheken Mitglieder mit denselben Namen enthalten, der naive Ansatz von Entpacken-Bibliotheken-in-Verzeichnis-und-Neupacken fehlschlagen wird – eines der Mitglieder geht verloren. Sie müssen eines der Mitglieder umbenennen, um Konflikte zu vermeiden.
– David gegeben
5. Juni 2013 um 14:46 Uhr
Avner
Auf Unix-ähnlichen Systemen können dies die Dienstprogramme ld und ar tun. Kasse http://en.wikipedia.org/wiki/Ar_(Unix) oder suchen Sie die Manpages auf einer beliebigen Linux-Box oder über Google, z. B. ‘Unix man ar’.
Bitte beachten Sie, dass Sie möglicherweise besser auf eine gemeinsam genutzte (dynamische) Bibliothek verlinken. Dies würde Ihrer ausführbaren Datei eine Abhängigkeit hinzufügen, aber es wird ihre Größe drastisch reduzieren, besonders wenn Sie eine Grafikanwendung schreiben.
-
Warum ist eine kleinere Bildgröße in Grafikanwendungen besser?
– ds-bos-msk
29. Dezember 2013 um 19:15 Uhr
-
Eine kleinere Bildgröße ist normalerweise besser. Grafikbibliotheken (xlib et. al.) neigen dazu, sehr groß zu sein und machen daher sehr große ausführbare Dateien, wenn sie statisch gelinkt werden.
– Avner
30. Dezember 2013 um 6:28 Uhr
-
Ohh, Sie meinten also GUI-Anwendungen. Ich dachte, Sie beziehen sich auf Grafiken wie in 3D-Engines mit GPU-Shadern und so …
– ds-bos-msk
1. Januar 2014 um 10:43 Uhr
-
Ja, ich bezog mich auf GUI-ähnliche Bibliotheken.
– Avner
1. Januar 2014 um 13:59 Uhr
Stern brillant
Unter Linux, MinGWoder Cygwinmit der GNU-Toolchain:
ar -M <<EOM
CREATE libab.a
ADDLIB liba.a
ADDLIB libb.a
SAVE
END
EOM
ranlib libab.a
Oder wenn Sie die Existenz von behalten können liba.a
und libb.a
:
ar crsT libab.a liba.a libb.a
Unter Windows mit der Microsoft Visual C++ Werkzeugkette:
lib.exe /OUT:libab.lib liba.lib libb.lib
-
Können Sie die MSCV-Toolchain bitte Schritt für Schritt näher erläutern? Dank.
– javaLover
29. März 2017 um 2:06 Uhr
-
@javaLover Ich würde gerne, aber es tut mir leid, dass ich im Moment keinen Windows-PC besitze.
– Stern brillant
30. März 2017 um 5:10 Uhr
-
Was meinst du mit “behalte die Existenz von
liba.a
undlibb.a
“? Können Sie das näher erläutern?– Peter Mortensen
27. Juni um 21:36 Uhr
Ed.
Ich bin mir nicht sicher, wie ich sie physisch in einer einzigen Datei kombinieren soll, aber Sie könnten eine Art Abstraktion verwenden und nur eine einzige “AllMyLibs.a/h” einfügen, die wiederum alles enthält, was Sie wollen. Sie könnten dies auch an der Stelle platzieren, an der Ihr Compiler nach Bibliotheken sucht, damit es für jedes Projekt funktioniert.
Greg Whitfield
Vielleicht verstehe ich das falsch, aber müssen Sie die Bibliotheken nicht nur versenden, wenn der Endbenutzercode sie direkt aufruft? Wenn der gesamte Zugriff auf JPEG-Methoden usw. von Ihrem Code in Ihrer statischen Bibliothek erfolgt, verknüpfen Sie einfach die Bibliotheken mit Ihrer Bibliothek.
Dh,
---------------------
| End-user EXE file |
---------------------
|
| makes calls to
|
v
--------------------
| Your static lib.a |
--------------------
| makes calls to and links
v
------------------------------------ .....
| | |
------------- -------- ----------
| libjpeg.a | |libz.a| |libpng.a|
------------- -------- ----------
Das heißt, es ist nur ein Problem, wenn der Endcode direkte Aufrufe in libz.a, libpng.a usw. tätigen muss.
Wenn der Anwendungscode zum Beispiel ein legitimes Bedürfnis hat, libz.a aufzurufen, dann wäre das wie oben erwähnt ein Fall für die Verwendung eines dynamischen Moduls.
-
Nein, Sie verlinken nicht, wenn Sie “Ihre statische lib.a” erstellen. Das Verknüpfen wird nur beim Erstellen der endgültigen ausführbaren Datei durchgeführt. Genau aus diesem Grund wurde die Frage gestellt.
– Trient
22. Mai 2009 um 22:01 Uhr
-
Tut mir leid, Trent, du liegst falsch. Das Verlinken gilt für Bibliotheken, nicht nur für EXE-Dateien.
– Greg Whitfield
18. Mai 2010 um 11:54 Uhr
-
@Greg; Trient hat recht. Das Erstellen einer Bibliothek ist lediglich das Zusammenstellen von Objektdateien in einem Archiv mit einer Symboltabelle. Es gibt keinen Compiler (cc) oder Linker (ld), nur das Archivierungstool (ar).
– whitey04
19. August 2011 um 22:15 Uhr
-
@whitey04: Genau genommen hast du recht oder natürlich. Aber ich sprach im lockereren Sinne von der Verwendung von Bibliotheken als Eingabe für andere Bibliotheken. Zumindest war ich das ursprünglich, obwohl mein Kommentar zu Trent dem widersprechen mag – schließlich lagen Monate zwischen ihnen … Vielleicht hätte ich in meinem Diagramm sagen sollen: “ruft an und verweist auf”. Ich zögere, Wikipedia zu zitieren – wir wissen, wie zuverlässig das sein kann 😉 – aber sehen Sie sich das Bild auf dieser Seite an, um zu sehen, worauf ich hinaus wollte – en.wikipedia.org/wiki/Linker_(Computing)
– Greg Whitfield
27. August 2011 um 17:44 Uhr
-
Ich weiß, dass dies eine alte Diskussion ist, aber ich bin kürzlich auf dieselbe Sache gestoßen, und ich muss mit Trent gehen. Ich habe eine statische Bibliothek gebaut, die Aufrufe macht
glib
(auch eine statische Bibliothek). Aber nichts von glib wurde in meine Bibliotheksdatei aufgenommen, die Aufrufe bleiben einfach als ungelöst. Wenn Sie versuchen, auf meine Bibliothek zu verlinken, ohne auch auf zu verlinkenglib
, führen diese nicht aufgelösten Aufrufe dazu, dass der Linker fehlschlägt. ich könnte benutzenar
zu verpackenglib
und meine Bibliothek zusammen in eine, aber das ist mit ziemlicher Sicherheit eine schlechte Idee (wird schließlich zu doppelten Definitionen für jemanden führen) und wird meine Bibliothek riesig machen.– Brianmearns
29. Oktober 2013 um 12:37 Uhr
Peter Mortensen
Das Kombinieren mehrerer Bibliotheken von Drittanbietern zu einer einzigen könnte für Sie zu weiteren Problemen führen – zum Beispiel, wenn zwei dieser Bibliotheken ein gemeinsames Symbol definieren, das Ihr Programm nicht verwendet. Jetzt müssen Sie alle (oder alle bis auf eine) Instanzen des gemeinsamen Symbols extrahieren, bevor Sie die Bibliotheken kombinieren.
-
Nein, Sie verlinken nicht, wenn Sie “Ihre statische lib.a” erstellen. Das Verknüpfen wird nur beim Erstellen der endgültigen ausführbaren Datei durchgeführt. Genau aus diesem Grund wurde die Frage gestellt.
– Trient
22. Mai 2009 um 22:01 Uhr
-
Tut mir leid, Trent, du liegst falsch. Das Verlinken gilt für Bibliotheken, nicht nur für EXE-Dateien.
– Greg Whitfield
18. Mai 2010 um 11:54 Uhr
-
@Greg; Trient hat recht. Das Erstellen einer Bibliothek ist lediglich das Zusammenstellen von Objektdateien in einem Archiv mit einer Symboltabelle. Es gibt keinen Compiler (cc) oder Linker (ld), nur das Archivierungstool (ar).
– whitey04
19. August 2011 um 22:15 Uhr
-
@whitey04: Genau genommen hast du recht oder natürlich. Aber ich sprach im lockereren Sinne von der Verwendung von Bibliotheken als Eingabe für andere Bibliotheken. Zumindest war ich das ursprünglich, obwohl mein Kommentar zu Trent dem widersprechen mag – schließlich lagen Monate zwischen ihnen … Vielleicht hätte ich in meinem Diagramm sagen sollen: “ruft an und verweist auf”. Ich zögere, Wikipedia zu zitieren – wir wissen, wie zuverlässig das sein kann 😉 – aber sehen Sie sich das Bild auf dieser Seite an, um zu sehen, worauf ich hinaus wollte – en.wikipedia.org/wiki/Linker_(Computing)
– Greg Whitfield
27. August 2011 um 17:44 Uhr
-
Ich weiß, dass dies eine alte Diskussion ist, aber ich bin kürzlich auf dieselbe Sache gestoßen, und ich muss mit Trent gehen. Ich habe eine statische Bibliothek gebaut, die Aufrufe macht
glib
(auch eine statische Bibliothek). Aber nichts von glib wurde in meine Bibliotheksdatei aufgenommen, die Aufrufe bleiben einfach als ungelöst. Wenn Sie versuchen, auf meine Bibliothek zu verlinken, ohne auch auf zu verlinkenglib
, führen diese nicht aufgelösten Aufrufe dazu, dass der Linker fehlschlägt. ich könnte benutzenar
zu verpackenglib
und meine Bibliothek zusammen in eine, aber das ist mit ziemlicher Sicherheit eine schlechte Idee (wird schließlich zu doppelten Definitionen für jemanden führen) und wird meine Bibliothek riesig machen.– Brianmearns
29. Oktober 2013 um 12:37 Uhr