Wie kann ich mehrere C/C++-Bibliotheken zu einer kombinieren?

Lesezeit: 7 Minuten

Benutzeravatar von GhassanPL
GhassanPL

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?

Benutzeravatar von Judge Maygarden
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ängen existinglib.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

Avners Benutzeravatar
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

Benutzeravatar von Star Brilliant
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 und libb.a“? Können Sie das näher erläutern?

    – Peter Mortensen

    27. Juni um 21:36 Uhr

Benutzeravatar von Ed
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.

Benutzeravatar von Greg Whitfield
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 verlinken glib, führen diese nicht aufgelösten Aufrufe dazu, dass der Linker fehlschlägt. ich könnte benutzen ar zu verpacken glib 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


Benutzeravatar von Peter Mortensen
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 verlinken glib, führen diese nicht aufgelösten Aufrufe dazu, dass der Linker fehlschlägt. ich könnte benutzen ar zu verpacken glib 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


1401750cookie-checkWie kann ich mehrere C/C++-Bibliotheken zu einer kombinieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy