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?
vous pouvez utiliser libtool
pour le faire
libtool -static -o new.a old1.a old2.a
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
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