使いやすさのために iOS 静的フレームワークにパッケージ化したい大きな静的ライブラリがあります。ライブラリは、実際には複数の.a
ファイルであり、ライブラリの論理モジュールごとに 1 つです。
デバイス用(ファット ファイル、、、)とシミュレータ用(ファット ファイル、、)用に.a
ビルドされたコンパイル済みファイルがあります。armv7
armv7s
arm64
i386
x86_64
さて、私の知る限り、適切なフレームワークを構築するには、これらすべてのファイルを 1 つの大きなファイルに結合する必要があります。
ここで説明した手法 (静的ライブラリの結合) を使用すると、次のことができます。
libtool -static -o new.a old1.a old2.a
しかし、明らかに両方old1.a
とold2.a
同じ記号が含まれています。したがって、フレームワークにリンクすると、(正当な理由で) リンカー エラーが発生しますduplicate symbols
。
それを行うためのより正しい方法 (したがって、シンボルの重複を回避する) は、ファイルを解凍し、.o
それらを大きな.a
ファイルに結合するようです (複数のライブラリ アーカイブ (.a) を 1 つのアーカイブ ファイルにパックする方法は? )
ar x old1.a
ar x old2.a
ar rcs new.a *.o
old1.a
ここで、とはファット ファイルであることを思い出してくださいold2.a
。アーキテクチャごとに分離する必要があります。
だからここに私がすることがあります:
lipo old1.a -thin armv7 -output armv7/old1.a
cd armv7; ar x old1.a; cd ..
...
lipo old1.a -thin x86_64 -output x86_64/old1.a
cd x86_64; ar x old1.a; cd ..
// Same goes for old2.a ...
// Then,
libtool -static -o new.a armv7/*.o armv7s/*.o arm64/*.o // ... etc
しかし、何らかの理由で、このように作成されたフレームワークに対してリンクすると、リンカーはシンボルを見つけることができません (nm
それらをすべて明らかにしたとしても)。
その静的フレームワークを構築する方法はありますか?