iOS 6 対応の為に CorePlot を armv7s 対応してビルドする

iOS 6 対応しようと思い、Xcode 4.5 を使って CorePlot を使ったアプリケーションをビルドしようとしたらリンカでエラーが出た…。

ld: file is universal (2 slices) but does not contain a(n) armv7s slice: /Users/.../CorePlot/libCorePlot-CocoaTouch.a for architecture armv7s
clang: error: linker command failed with exit code 1 (use -v to see invocation)

armv7s 用のコードが入ってないって…。


Xcode 4.5 から出てきた新しいアーキテクチャの armv7s 用のコードは、Xcode 4.5 がリリースされる前に出ていた CorePlot のライブラリに入っている筈もなくリンクできなくてエラーになっちゃう…。
(これ、シミュレータで動作確認してる時は出ない。CorePlotのライブラリには既に i386 のコードは入ってるから。)


たぶん、一番簡単な対処方法はアプリケーションビルド時の「Valid Architectures」から「armv7s」を削除しちゃえば良い。

でも、それだと armv7s でのパフォーマンスが若干落ちる(んじゃないか)と思うので、なんだか悔しい。


というわけで、今回は CorePlot のライブラリを armv7s も含めて自分でビルドして組み込んでみたのでメモ。

CorePlot を armv7s 込みでビルドしてみる

CorePlot は現在バージョン 1.0 で、下記ページからダウンロードできる。

ダウンロードした CorePlot_1.0.zip を展開すると CorePlot_1.0 フォルダができるので、Source->framework と開いていくと CorePlot-CocoaTouch.xcode プロジェクトファイルが見つかる。


CorePlot-CocoaTouch.xcode を見つけたらダブルクリックして Xcode 4.5 を起動、そのまま command+B でビルドすると…。
エラー!

clang: error: -Z-reserved-lib-stdc++: 'linker' input unused when '-c' is present
Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang failed with exit code 1

あ〜このエラーなんか前にも似たようなのを見たことある!


というわけで「Build Options」の「Compiler for C/C++/Objective-C」で選択されているのを「Apple LLVM compiler 4.1」から「LLVM GCC 4.2」へ変更。


これで再度ビルドしてみると…
無事、ビルド終了。


出来上がったライブラリファイルは Source->build にできてる。

選択している scheme によって build 以下のフォルダ名が変わるけど、たぶん何も変更せずにビルドしたなら Debug-iphoneos か Debug-iphonesimulator フォルダに libCorePlot-CocoaTouch.a ができているはず。
上の絵は、scheme で Release になるようにして、iOS Device を選択してビルドしたときのキャプチャ。

CorePlotをUniversal Binaryでビルドする

ただ、これだと実機では動くけどシミュレータでは動かない。なぜなら i386 用のコードが入っていないから。
というわけで、そこも一緒に入れてくれるのが Universal Library scheme


scheme で Universal Library を選択してビルドすると、armv7s, armv7, i386 全てのコードを入れたライブラリを作ってくれる。

(実際には実機とシミュレータ用のライブラリを Release build で作って lipo でくっ付けてる。)


出来上がったファイルを file コマンドで見てみるとこんな感じ。

iMac-i3-27:Release-universal paraches$ file ./libCorePlot-CocoaTouch.a 
./libCorePlot-CocoaTouch.a: Mach-O universal binary with 3 architectures
./libCorePlot-CocoaTouch.a (for architecture armv7):	current ar archive random library
./libCorePlot-CocoaTouch.a (for architecture cputype (12) cpusubtype (11)):	current ar archive random library
./libCorePlot-CocoaTouch.a (for architecture i386):	current ar archive random library
iMac-i3-27:Release-universal paraches$ 

armv7 と i386 はちゃんと表示されるんだけど、armv7sって cputype (12) cpusubtype (11)ってことで良いのかな?


というわけで、Xcode 4.5 がリリースされたので各ライブラリも直ぐに armv7s 対応してアップデートされると思うけど、それを待てない!って場合は自分でライブラリをビルドしてみるのも面白いんじゃないかな?