web-dev-qa-db-fra.com

Combinez des bibliothèques statiques

J'ai essayé l'approche dans cette question , mais il semble que la version linux de ar ne soit pas la même que la version mac, car je n'ai pas réussi à combiner à nouveau les fichiers objet.

Ce que je veux fondamentalement, c'est fusionner une autre bibliothèque statique dans mon produit de construction de bibliothèque statique Xcode via une phase de construction de script d'exécution.

Malheureusement, je ne peux pas compiler directement l'autre bibliothèque dans mon projet car il possède son propre système de construction (par conséquent, j'utilise les bibliothèques compilées).

Je pense qu'il devrait être possible de fusionner l'autre bibliothèque via ar dans la bibliothèque générée par Xcode sans décompiler le produit généré. Comment puis-je accomplir ceci?

39
Erik Aigner

vous pouvez utiliser libtool pour le faire

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

Si vous avez affaire à des bibliothèques statiques multi-architectures, un peu plus de manipulation est nécessaire pour éclaircir chaque bibliothèque, combiner les versions amincies, puis grossir le résultat. Voici un script pratique que vous pouvez éditer à votre satisfaction et qui fait tout cela en un. L'exemple prend trois bibliothèques iOS path/to/source/libs/libone.a, path/to/source/libs/libtwo.a et path/to/source/libs/libthree.a et les fusionne dans une bibliothèque unique 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
4
bleater

Vous devez utiliser ar -r pour créer une archive sur MacOS:

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