自分でビルドしたiOSバイナリからUniversal Static Libraryを作成します。

Introduction

Universal Static Libraryというのは複数のアーキテクチャのバイナリが一つに結合されたバイナリです。
つまり、arm7、arm7s、arm64などを一つのバイナリとして扱うことが可能です。

これによって、アーキテクチャに応じてバイナリのリンクを変更しなくて済むというメリットがあります。
しかし、当然バイナリサイズが膨れ上がるので、サポートするつもりのないアーキテクチャのバイナリは除外するか、そもそも個々のバイナリを小さくする工夫が必要です。

OpenCVは後者のサイズを小さくする工夫が可能です。
ビルドオプションで必要なコンポーネントだけを指定することができます。

工夫の方法は割愛して、単純に作成したlibopencv_merged.aを、Universal Static Libraryとして結合してみます。
掲題の通りなんですが、情報が少ないんですよ。

How to do?

OpenCVのiOSビルドを行うと、下記のアーキテクチャのバイナリが生成されます。

  • armv7
  • armv7s
  • arm64
  • i386
  • x86_64

最後の2つはsimulator用ですが。

また、出力先の /lib/Releaseにはlibopencv_merged.aが存在します。
libopencv_world.aとは違い、他の静的ライブラリ(libpng.aとか)を結合しているように見えます。

これを結合してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ xcrun -sdk iphoneos lipo -create ./build-armv7-iphoneos/lib/Release/libopencv_merged.a \
./build-armv7s-iphoneos/lib/Release/libopencv_merged.a \
./build-arm64-iphoneos/lib/Release/libopencv_merged.a \
./build-i386-iphonesimulator/lib/Release/libopencv_merged.a \
./build-x86_64-iphonesimulator/lib/Release/libopencv_merged.a \
-output ./libopencv_merged.a
$ file libopencv_merged.a
libopencv_merged.a: Mach-O universal binary with 5 architectures: [arm_v7:current ar archive] [arm_v7s] [i386] [x86_64] [arm64]
libopencv_merged.a (for architecture armv7): current ar archive
libopencv_merged.a (for architecture armv7s): current ar archive
libopencv_merged.a (for architecture i386): current ar archive
libopencv_merged.a (for architecture x86_64): current ar archive
libopencv_merged.a (for architecture arm64): current ar archive

一つのlibopencv_merged.aが生成され、fileコマンドで確認すると全部のアーキテクチャが一つになっていることがわかります。