Watson's Blog

RubyMotion で使う iOS スタティックライブラリを作る

| Comments

今日はどのように iOS スタティックライブラリを作るのか、Xcode と格闘していました。

何も考えずにビルドしてしまうと ARM 用のバイナリのみのライブラリができてしまい、i386 バイナリを必要とするシミュレータ用には使えません。

ビルドの仕方がわからずに、どうすればライブラリが作れるか試行錯誤の課程を書きます。

ライブラリ用のプロジェクトを作成

Xcode で “Cocoa Touch Static Library” というテンプレートを選択し、スタティックライブラリ用のプロジェクトを作成します。

cocoa touch static library

あとは、ライブラリで必要なプログラムを書きます。

ビルドする

ARMv6、ARMv7、i386 バイナリを含むユニバーサルなライブラリが欲しいのですが、Xcode でどのようにビルドすれば良いのかわからず途中であきらめ、Terminal 上での操作しました。

Terminal で作成したプロジェクトのディレクトリに移動します。今回は “foo” という名前でプロジェクトを作成しています。

1
2
$ ls
foo/           foo.xcodeproj/

ARM バイナリを作成します。

1
2
3
4
5
$ xcodebuild -arch armv6 -arch armv7 -arch armv7s
$ file build/Release-iphoneos/libfoo.a 
build/Release-iphoneos/libfoo.a: Mach-O universal binary with 2 architectures
build/Release-iphoneos/libfoo.a (for architecture armv6): current ar archive random library
build/Release-iphoneos/libfoo.a (for architecture armv7): current ar archive random library

i386 バイナリは SDK に iphonesimulator を指定するとビルドされるようです。

1
2
3
$ xcodebuild -sdk iphonesimulator
$ file build/Release-iphonesimulator/libfoo.a 
build/Release-iphonesimulator/libfoo.a: current ar archive random library

ライブラリファイルが 2 つになってしまったので、lipo コマンドを使って 1 つに結合します。

1
2
3
4
5
6
$ lipo -create build/Release-iphoneos/libfoo.a build/Release-iphonesimulator/libfoo.a -output libfoo.a
$ file libfoo.a 
libfoo.a: Mach-O universal binary with 3 architectures
libfoo.a (for architecture armv6): current ar archive random library
libfoo.a (for architecture armv7): current ar archive random library
libfoo.a (for architecture i386):  current ar archive random library

これで欲しかったライブラリができあがりました。

もっと簡単に作れる方法をご存じの方がおられましたら、ご教示ください。

Comments