読者です 読者をやめる 読者になる 読者になる

甘いものが好きです

iOS App開発時に感じた疑問や課題、その他の雑感などを書いていきます。

XcodeでLeap Motion対応アプリ開発の準備(Objective-C版)

Leap Motion対応アプリはさまざまなプログラミング言語で開発することができるが、今回は、Xcode上で主にObjective-Cを使ってMac Appを開発することにした。

開発環境は次のとおり。

  • OS X 10.8.2 (12C60)
  • Xcode 4.6 (4H127)
  • Leap Developer Kit 0.7.3

Leap Motion Developer Potalで配布されているLeap SDKの中には、サンプルのXcodeプロジェクトがある。Xcodeの新規プロジェクトを作成し、このサンプルプロジェクトと同じものを一から作ってみた。その手順と、その中で苦労した点についてまとめておく。

Leap関連のヘッダ/ソースファイルをXcodeプロジェクトに追加

Xcodeプロジェクトに次のファイルを追加する。

  • Leap.h
  • LeapMath.h
  • LeapObjectiveC.h
  • LeapObjectiveC.mm

ファイル追加時に表示される「Choose options for adding these files」画面では、アプリのビルドに使用するターゲットについて「Add to targets」でチェックを入れる。

正しく追加されると、「Compile Sources」*1に「LeapObjectiveC.mm」が含まれている。

ヘッダ検索パス(必要ならば)

上記ファイルの置き場によっては、ヘッダ検索パスの設定*2を変更しておかなければならない。

C++ Standard Library

また、Xcodeプロジェクトのデフォルトでは「C++ Standard Library」の設定*3で「libc++ (LLVM C++ standard library with C++11 support)」が選択されているので、これを「libstdc++ (GNU C++ standard library)」に変更する。

この設定変更を行わなければ、次のようなビルドエラーが発生する。

Undefined symbols for architecture x86_64:
"Leap::Config::type(std::__1::basic_string, std::__1::allocator > const&) const", referenced from:
-[Config type:] in LeapObjectiveC.o
...
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

libLeap.dylibをXcodeプロジェクトに追加

libLeap.dylibをXcodeプロジェクトに追加する。Leap SDKにはlibLeap.dylibという名前のファイルが2つあるので、「libc++」フォルダ配下にあるものではなく、もう一方のlibLeap.dylibを使用するように注意する。

ライブラリファイル追加時に表示される「Choose options for adding these files」画面では、アプリのビルドに使用するターゲットについて「Add to targets」でチェックを入れる。

正しく追加されると、「Link Binary With Libraries」と「Copy Bundle Resources」の両方*4に「libLeap.dylib」が含まれている。

ライブラリ検索パス(必要ならば)

ライブラリの置き場によっては、ライブラリ検索パスの設定*5を変更しておかなければならない。

Run Scriptの設定

アプリ実行時に動的にライブラリファイルの位置指定を変更する。次のようなRun Scriptを設定すればよい。

# print some debug information
echo TARGET_BUILD_DIR=${TARGET_BUILD_DIR}
echo TARGET_NAME=${TARGET_NAME}
cd ${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Contents/MacOS
ls -la
# then remap the loader path
install_name_tool -change @loader_path/libLeap.dylib @executable_path/../Resources/libLeap.dylib ${TARGET_NAME}

この設定を行わなければ、次のような実行時エラーが発生する。

dyld: Library not loaded: @loader_path/libLeap.dylib
Referenced from: ...
Reason: image not found

これで準備OK

これで準備が終わったので、この後は実際にLeap Motionを使って各種データを取得するコードを書いていく。

*1:Project Navigator上でプロジェクトを選択 -> アプリのビルドに使用するターゲットを選択 -> 「Build Phases」タブを選択

*2:Project Navigator上でプロジェクトを選択 -> アプリのビルドに使用するターゲットを選択 -> 「Build Settings」タブを選択 -> 「Search Paths」セクション内の「Header Search Paths」

*3:Project Navigator上でプロジェクトを選択 -> アプリのビルドに使用するターゲットを選択 -> 「Build Settings」タブを選択 -> 「Apple LLVM compiler 4.2 - Language」セクション内の「C++ Standard Library」

*4:Project Navigator上でプロジェクトを選択 -> アプリのビルドに使用するターゲットを選択 -> 「Build Phases」タブを選択

*5:Project Navigator上でプロジェクトを選択 -> アプリのビルドに使用するターゲットを選択 -> 「Build Settings」タブを選択 -> 「Search Paths」セクション内の「Library Search Paths」