web-dev-qa-db-ja.com

静的ライブラリを組み合わせる

私はこのアプローチを試してみました 質問 ですが、オブジェクトファイルを再度結合できなかったため、arのLinuxバージョンはMacバージョンと同じではないようです。

私が基本的にやりたいのは、実行スクリプトのビルドフェーズを介して、別の静的ライブラリをXcode静的ライブラリビルド製品にマージすることです。

残念ながら、独自のビルドシステムがあるため、他のライブラリをプロジェクトに直接コンパイルすることはできません(したがって、コンパイルされたライブラリを使用します)。

ビルド製品を逆コンパイルすることなく、arを介して他のライブラリをXcodeで生成されたライブラリにマージできると思います。どうすればこれを達成できますか?

42
Erik Aigner

libtoolを使用して実行できます

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

マルチアーキテクチャの静的ライブラリを扱っている場合、各ライブラリをシン化し、シン化されたバージョンを組み合わせて結果を肥大化するために、少し追加の操作が必要です。以下は、すべてを1つにまとめて編集できる便利なスクリプトです。この例では、3つのiOSライブラリpath/to/source/libs/libone.apath/to/source/libs/libtwo.apath/to/source/libs/libthree.aおよびそれらを単一のライブラリーにマージします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
5
bleater

MacOSでアーカイブを作成するには、ar -rを使用する必要があります。

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