iOS用にユニバーサルライブラリを作る
BlocksKitをフレームワーク化した
iOS8対応のためBlocksKitをフレームワーク化したログ。
ソースコードのまま組み込むとかイヤなのでよく外部のライブラリはフレームワークにしているのでメモ。
手順
ダウンロードからビルドまで
- github から最新ソースコードをダウンロード
- ターゲットをBlocksKitにしてiOS Device用Releaseビルド
- ターゲットをBlocksKitのままiPhone Simulator用Releaseビルド
- OrganizerでBlocksKitのDerived Dataディレクトリ右の->をクリックしてFinderに表示
以下コマンドライン
ターミナルのログからひっぱり出したコマンドなので間違ってる可能性は否定できない。
$ cd <Derived Data Dir> // FinderからD&Dでpathが貼り付けできるのでそれがらく)
$ xcrun lipo -info ./Release-iphoneos/libBlocksKit.a
Architectures in the fat file: ./Release-iphoneos/libBlocksKit.a are: armv7 arm64
$ xcrun lipo -info ./Release-iphonesimulator/libBlocksKit.a
Architectures in the fat file: ./Release-iphonesimulator/libBlocksKit.a are: i386 x86_64
$ mkdir -p BlocksKit.framework/Versions/A // まとめて必要なディレクトリを作っておく
$ lipo -create ./Release-iphonesimulator/libBlocksKit.a ./Release-iphoneos/libBlocksKit.a -output ./BlocksKit.framework/Versions/A/libBlocksKit.a
$ xcrun lipo -info ./BlocksKit.framework/Versions/A/libBlocksKit.a
Architectures in the fat file: ./BlocksKit are: i386 x86_64 armv7 arm64
$ cp -r ./Release-iphoneos/include ./BlocksKit.framework/Versions/A/Headers
$ cd BlocksKit.framework
$ ln -sfh ./Versions/Current ./Versions/A
$ ln -sfh ./Versions/Current/Headers ./Headers
$ ln -sfh ./Versions/Current/BlocksKit ./BlocksKit
こんな感じで問題ないはず。
その他
ユニバーサルライブラリ
lipoコマンドでユニバーサルライブラリを作るときに-arch
オプションを付けてアーキテクチャの指定をすることも可能だけど、今回はiOSデバイスとiOSシミュレータでそれぞれのバイナリが既にユニバーサルになっているので、-arch
オプションは不要。
もしコマンドラインとかで各アーキテクチャ用にビルドして結合させる場合は-arch
をつけて
$ lipo -create -arch i386 ./[input binary name]> -arch armv7 ./[input binary name] -output ./[output binary name]
みたいにすればよかった気がする。
バイナリの対応アーキテクチャの確認方法について
lipo -info <binary path>
で確認するとarm64が表示できず(cputype (16777228) cpusubtype (0))
とかなるみたいなので、xcrun lipo -info
がいいと思う。
ただのlipoがダメというわけではない。
あとこの手の作業をする人はotool
コマンドも使った方がいろいろと捗るはず。
詳しくはman otool