Kombinieren Sie statische Bibliotheken auf Apple

Lesezeit: 2 Minuten

Ich habe den Ansatz in dieser Frage versucht, aber es scheint die Linux-Version von ar ist nicht dasselbe wie die Mac-Version, da ich die Objektdateien nicht erneut kombiniert habe.

Was ich im Grunde tun möchte, ist, eine andere statische Bibliothek in mein statisches Xcode-Bibliotheks-Build-Produkt über eine Run-Script-Build-Phase zusammenzuführen.

Leider kann ich die andere Bibliothek nicht direkt in mein Projekt kompilieren, da sie ein eigenes Build-System hat (daher verwende ich die kompilierten Bibliotheken).

Ich denke, es sollte möglich sein, die andere Bibliothek über einzubinden ar in die von Xcode generierte Bibliothek, ohne das Build-Produkt zu dekompilieren. Wie mache ich das?

Sie können verwenden libtool es zu tun

libtool -static -o new.a old1.a old2.a

  • Dies ist eigentlich eine bessere Lösung als ar. Vielen Dank!

    Benutzer187676

    17. November 2011 um 18:33 Uhr

  • jede Befehlszeile (Bash), sollten Sie libtool in PATH haben, vorausgesetzt, Sie haben die Entwicklererweiterung. Alternativ als Post-Build-Schritt in xcode.

    – Bruce

    23. Januar 2013 um 16:09 Uhr


  • Sie müssen herunterladen und installieren libtool. Dies ist im Befehlszeilentool von Xcode.

    – versunken glücklich

    15. März 2013 um 9:37 Uhr

  • @MohamMad Ich habe diesen Aufruf als Build-Phasen-Skript hinzugefügt. Weitere Einzelheiten unter stackoverflow.com/a/21225126/239408

    – Xvergen

    20. Januar 2014 um 2:04 Uhr


  • Das war genau das, was ich brauchte. Es wurde als Run-Script-Build-Schritt in XCode hinzugefügt und funktionierte wie ein Zauber. Vielen Dank.

    – Ternär

    11. August 2014 um 14:48 Uhr

Wenn Sie es mit statischen Bibliotheken mit mehreren Architekturen zu tun haben, ist ein wenig zusätzliche Manipulation erforderlich, um jede Bibliothek auszudünnen, die ausgedünnten Versionen zu kombinieren und dann das Ergebnis zu fetten. Hier ist ein praktisches Skript, das Sie zu Ihrer Zufriedenheit bearbeiten können und das alles in einem erledigt. Das Beispiel nimmt drei iOS-Bibliotheken path/to/source/libs/libone.a, path/to/source/libs/libtwo.aund path/to/source/libs/libthree.a und führt sie in einer einzigen Bibliothek zusammen libcombined.a.

#! /bin/bash

INPATH="path/to/source/libs"

LIBPREFIX="lib"
LIBS="one two three"
LIBEXT=".a"

OUT="combined"

ARCHS="armv7 armv7s arm64"

for arch in $ARCHS
do
  for lib in $LIBS
  do
    lipo -extract $arch $INPATH/$LIBPREFIX$lib$LIBEXT -o $LIBPREFIX$lib-$arch$LIBEXT
  done
  INLIBS=`eval echo $LIBPREFIX\{${LIBS// /,}\}-$arch$LIBEXT`
  libtool -static -o $LIBPREFIX$OUT-$arch$LIBEXT $INLIBS
  rm $INLIBS
done

OUTLIBS=`eval echo $LIBPREFIX$OUT-\{${ARCHS// /,}\}$LIBEXT`
lipo -create $OUTLIBS -o $LIBPREFIX$OUT$LIBEXT
rm $OUTLIBS

  • Dieses Skript schien nicht mit überlappenden Namen umzugehen. Der letzte Limousinenbefehl hat vor doppelten Namen gewarnt und das Inhaltsverzeichnis hat keine Begriffsklärung angezeigt, daher denke ich, dass es nicht funktionieren würde.

    – Chris Quenelle

    4. August um 23:32 Uhr

Sie sollten nur in der Lage sein, einen mit dem anderen zu verknüpfen. Also … einfach benutzen ld um die Bilder zusammenzuführen.

Du solltest benutzen ar -r So erstellen Sie ein Archiv unter MacOS:

ar -x libabc.a
ar -x libxyz.a
ar -r libaz.a  *.o

1409570cookie-checkKombinieren Sie statische Bibliotheken auf Apple

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

Privacy policy