この記事は RubyMotion Advent Calendar 2012の二日目の記事です。
第2回RubyMotionもくもく会でYahoo! iOSマップSDKのサンプルをRubyMotionに翻訳していて
http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/iphonesdk/tutorial2.html
YMKCoordinateRegionMakeのところで
Undefined symbols for architecture i386: "___concrete__YMKCoordinateRegionMake", referenced from: _MREP_F77F7B4AA08045E9933EBA24E7FDF1CA in app_delegate.rb.o "___concrete__YMKCoordinateSpanMake", referenced from: _MREP_F77F7B4AA08045E9933EBA24E7FDF1CA in app_delegate.rb.o ld: symbol(s) not found for architecture i386
こんなエラーで落ちます。何を言ってるのか分からなかったのですがWatsonさんのおかげでサードパーティーのライブラリのマクロは自動で定義されないので存在しないことが分かりました。
大文字で始まっているのですぐ気づいても良さそうなものですが、このときは全然気づかなかった(汗)
本題はそこではなくて、frameworkのヘッダファイルからYMKCoordinateRegionMake
を探して同じ事をするメソッドを定義する際にC構造体の扱いがすぐに分からなかったこと。
該当ヘッダファイルの内容はこうでした。
マクロじゃなくてstatic inlineな関数でしたが同じ事なのでしょう。
このYMKCoordinateSpan
構造体のオート変数としてspanを定義するところです。
構造体変数はframework内で使われているので勝手に他のもの代替するわけにはいきません。YMKCoordinateSpan
構造体としてのアクセス領域が必要です。
これはPointer
を使えば回避できます。
http://www.rubymotion.com/developer-center/guides/runtime/#_pointers
元のプログラムはオート変数を生成して値を設定しそのまま返して、値をコピーして利用している。同じ事をするためにYMKCoordinateSpan
型のポインタを作ったら#value
で値を取得して使用します。([0]
で値にアクセスしてもいいですが)
これでバッチリ動作するようになりました。
余談ですが、再定義しても上記のようにメソッド名をYMK...
からymk...
と小文字に変えないと動きませんでした。static inlineの方の定義が使えないのに名前としては参照できるからという事でしょうか...(・ω・)