monozuku

PC、DIY、電子工作等の情報を発信しています

LuaとLuabindでiPhoneプログラミング

LuaとLuabindを使ってiPhoneアプリケーションを作成するメモです。
ここではLua5.1.4およびLuabind0.9を使用しました。

関連ライブラリのインストール

Lua, Boost, Luabindがまだインストールできていない場合はインストールします。MacPortsを使用するのが比較的早いようです。

  1. 最新のMacPortsをダウンロードしてインストール
  2. sudo ports selfupdate
  3. sudo ports install lua
  4. sudo ports install boost

また、.bashrcと.zshrcをこのページを参考に設定しておきます。

export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
export MANPATH=/opt/local/man:$MANPATH
export LIBRARY_PATH=/opt/local/lib:$LIBRARY_PATH
export LD_LIBRARY_PATH=/opt/local/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/opt/local/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/opt/local/include:$CPLUS_INCLUDE_PATH
export DYLD_FALLBACK_LIBRARY_PATH=/opt/local/lib
export BOOST_ROOT=/opt/local/include/boost:$BOOST_ROOT

つぎにLuabindをインストールします。
これもMacPortsから入れようとしたけどまだ使用できないみたいなので、サイトからダウンロードして直接luabindディレクトリを/opt/local/include/にコピーします。

% sudo cp -r luabind /opt/local/include/

iPhone (ARM) 用ライブラリの作成

iPhone用にLuaとLuabindのライブラリ(.a)を作成します。さらに、デバイス用とシミュレータ用の2種類も同時に作ります。

  1. Lua用ライブラリのプロジェクト(luaarm)をXCodeで作る

※プロジェクトの種類はCocoa Touch静的ライブラリとします。

  1. Luaのsrcフォルダの中身(lua.cとluac.c以外)をすべてClasses/に入れる
  2. シミュレータおよびデバイスの設定で、Releaseでビルドする
  3. build/ディレクトリに出力されるluaarm.aを/opt/local/lib/などにコピー
  4. Luabindも同様にビルドする。ただし、プロジェクト->プロジェクト設定を編集 から「ビルド」タブの「ヘッダ検索パス」に/opt/local/includeを追加。

lua.hppの編集

この日の記事のように、lua.hppを編集します。

#if __cplusplus
extern "C" {
#endif

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

#if __cplusplus
}	// extern "C"
#endif

テストプロジェクトの作成

以上でインストールは完了です。テストプロジェクトを作成して試してみましょう。

プロジェクトを作成し、プロジェクトのヘッダ検索パスに/opt/local/includeを追加します。また、プロジェクトに先ほど作ったライブラリ libluabindarm.a および libluaarm.a を追加します。

以上のようにして使えるはずです。

L = luaL_newstate();
if(!L) {
    std::cout << "Failed to open lua\n";
    return;
}
luaL_openlibs(L);
luabind::open(L);

luabind::module(L) [
   ... 関数定義など
];

NSString *path = [[NSBundle mainBundle] pathForResource:[NSString stringWithCString:filename] ofTye:nil];

// ファイルを実行する
if(luaL_loadfile(L, [path UTF8Sring]) || lua_pcall(L, 0, 0, 0)) {
    std::cout << "Failed to load\n";
}

補足

  • nil.hppでエラーが出るときは、extern...の行をコメントアウトしても普通に動きました(保証はしませんが)。
  • Luabindを実行するファイルは拡張子を .mm (Objective-C++) としてください。
  • Luabindでバインドするクラス中でObjective-Cのクラスを使用したい場合は、そのクラス実装の拡張子を .mm とし、使用するObjective-Cのクラスのプロトタイプ宣言をclassキーワードで行うことで実現できます。