Xcode4 で定義へのジャンプに失敗する

SPECIAL


Xcode4 で Jump to Definition を実行しても該当箇所に移動できない場合

Xcode3 で作成していた iPhone アプリのプロジェクトを Xcode4 でプログラミングしようとしたときのこと、コード内の単語の定義位置を調べようと思って、右クリックして "Jump to Definition" を選択したところ、期待した通りに動作してくれませんでした。

ポップアップメニューから "Jump to Definition" を選択すると、通常であれば、その単語が定義されているソースコードが開かれて、その定義場所まで自動的にたどり着いて表示してくれるはずなのですけど、今はこれを実行してみても "Symbol Not Found" となってしまいました。

そういえば、独自に定義したクラスばかりでなく NSString 等の標準的なクラスについても、エディター上で色がついていなかったので、全体的な解析ができていない可能性があります。

そこでとりあえず、クリーンビルドしてみたりしましたけど、それでも直る感じはありませんでした。

Xcode3 と Xcode4 との互換性の問題かもしれないと思って、とりあえず Xcode4 でプロジェクトを新規作成して、必要ファイルをそこに取り込んでみたところ "Jump to Definition" が正しく動作するようになりましたけど、ソース管理 (Subversion) にインポートして、それをまたチェックアウトしてみたところ、再びまた "Jump to Definition" ができなくなってしまいました。

 

これだと、せっかく新規に Xcode4 のプロジェクトを作って元のプロジェクトと同じように設定しても、何かをしたタイミングでまたおかしくなってしまう可能性もあって、安心して利用できない感じです。

そこで、わざわざ Xcode4 のプロジェクトを作り直さなくても "Jump to Definition" を正常に動作できるようにする方法がないかと思って試行錯誤してみたところ、とりあえずどうやら次のようなものを試せば、動作してくれるようになるかもしれないことが分かりました。

 

まず、コンパイラを "Apple LLVM Compiler" にします。

これは、プロジェクトを開いて、左側メニューからプロジェクト名を選択したら、その隣に表示される "PROJECT" 欄のプロジェクト名を選択して、さらにその隣で "Build Settings" タブを選択して、その中の "Build Options" で行います。

ここで "Apple LLVM compiler 3.0" を選択すると、これでコンパイラーが "Apple LLVM compiler" に変更されます。

とりあえずこのコンパイラーで、プロジェクトがビルドできるようにソースコードを調整します。

ほかのコンパイラーの "GCC" や "LLVM GCC" とは少しだけ構文に違いがある(GCC よりも厳密・正確な記述を求められる)ようなので、ビルドを通すためにはソースコードを修正する必要が出てくるかもしれません。

 

プロジェクトを LLVM コンパイラーでビルドできるようになったら、このプロジェクトに何か 1 つ、てきとうにフレームワークを追加します。

ちなみに Xcode4 でフレームワークを追加する方法は Xcode3 のときとは大きく違っています。

左側メニューのプロジェクト名を選択したら、その隣に表示される "TARGETS" 欄からプロジェクト名を選択します。そして、タブから "Build Phases" を選択して、その下の欄の "Link Binary With Libraries" に注目します。

枠の下の方にある [ + ] をクリックすることで、追加可能なフレームワークの一覧が表示されるので、その中からとりあえずてきとうなものを登録してあげます。

フレームワークを追加したら、エディターに戻るかプロジェクトをビルドすると、インデックスの再構築が行われます。

そして、インデックスの再構築が終わったときに、コードエディター内のキーワードに色がつくようになりました。そしてそれを右クリックして "Jump to Definition" を選択してみると、正しくそのコードの定義の場所まで移動してくれるようになりました。

 

これで確実に直るかどうかはわかりませんけど、とりあえず Apple LLVM compiler でビルドするためのプログラムのソースコードを正しく直すことと、フレームワークの追加によってインデックスを更新することと、この 2 つがカギになっているのかもしれません。

ともあれ "Jump to Definition" が使えるようになったら、先ほど登録したフレームワークを消去したり、コンパイラーを Apple LLVM compiler 以外のものに戻してしまっても大丈夫な様子です。

ただ、LLVM コンパイラーは GCC と比べてより動作が速いプログラムがビルドできるらしいですし、構文チェックが厳密で、エラーもしっかりと報告してくれるので、せっかくなので、支障がなければコンパイラーは Apple LLVM compiler のままにしておく方がお勧めのように思いました。