Frage

Ich bin müde link hinzufügen von zehn Bibliotheken in meinem Projekt, oder fordern acht von Ihnen sind meine eigenen.Ich möchte vorhandene Bibliotheken wie libpng.a, libz.a, libjpeg.ein, und kombinieren Sie zu einer einzigen .eine Bibliothek.Ist das möglich?Wie sieht die Kombination .lib-Bibliotheken?

War es hilfreich?

Lösung

Auf Unix-ähnlichen Systemen, die ld-und ar-Dienstprogramme, die dies tun können.Check-out http://en.wikipedia.org/wiki/Ar_(Unix) oder lookup-der man-Seiten, die auf jedem linux-box oder über google, e.g "unix-man-ar'.

Bitte beachten Sie, dass Sie vielleicht besser dran Verknüpfung zu einem freigegebenen (dynamische) Bibliothek.Dies würde hinzufügen einer Abhängigkeit zu Ihrer ausführbaren Datei, sondern wird drastisch reduziert seine Größe, vor allem, wenn Sie schreiben, eine Grafik-Anwendung.

Andere Tipps

Ziehen Sie die Objekt-Dateien aus jeder Bibliothek mit

ar x <library name>

und dann verschmelzen Sie alle in eine neue Bibliothek mit

ar cs <new library name> <list each extracted object file>

Auf Linux-oder MinGW oder Cygwin, mit der GNU-toolchain:

ar -M <<EOM
    CREATE libab.a
    ADDLIB liba.a
    ADDLIB libb.a
    SAVE
    END
EOM
ranlib libab.a

Oder wenn Sie können Sie halten die Existenz von liba.a und libb.a:

ar crsT libab.a liba.a libb.a

Unter Windows mit MSVC toolchain:

lib.exe /OUT:libab.lib liba.lib libb.lib

Vielleicht bin ich Missverständnis, aber nicht, Sie nur haben zu Schiff die libs, wenn die end-user code ruft Sie nicht direkt?Wenn alle Zugriff auf Jpeg-Methoden usw. ist aus dem code in Ihre statische Bibliothek, dann einfach link die libs in Ihrem lib.

I. e.

----------------
| End-user exe |
----------------
      |
      | makes calls to
      |
      v
 --------------------
 | Your static lib.a | 
 --------------------
         | makes calls to and links
         v
     ------------------------------------ .....
     |                    |         |
  -------------    -------- ---------- 
  | libjpeg.a |    |libz.a| |libpng.a|
  -------------    -------- ----------

I. e, es ist nur ein Problem, wenn Ende muss der code für direkte Anrufe in libz.eine, die libpng.ein etc.

Wenn die app den code nicht ein berechtigtes benötigen, rufen Sie libz.einer, zum Beispiel, dann wäre das, wie oben erwähnt, werden ein Fall für die Verwendung einer dynamischen Modul.

PS:Bekomme ich eine Künstler-Abzeichen?:)

Ich bin mir nicht sicher, wie Sie physisch zu kombinieren Sie in einer einzigen Datei, aber Sie einsetzen konnte, eine Abstraktion, die von einer Art, und nur einen einzigen "AllMyLibs.a/h", die enthält alles, was Sie wollen.Sie könnte auch setzen diese in die Lage, wo Ihre compiler sucht nach Bibliotheken, so dass es funktionieren würde für jedes Projekt.

P. S.- Aus Neugier, warum magst du nicht darunter Einzel-libs?

Die Kombination mehrerer Bibliotheken von Drittanbietern in einem könnte mehr Probleme schaffen für Sie--zum Beispiel, wenn zwei dieser Bibliotheken definieren ein gemeinsames symbol, das Ihr Programm nicht verwenden.Sie haben jetzt extrahieren Sie alle (oder alle-aber-einer) von den Instanzen der gemeinsamen symbol, bevor Sie verbinden die Bibliotheken.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top