C++ からの Lua スクリプトの呼び出し

C++ から Lua のファイル自体を実行する手順と、Lua 内の関数を呼び出す手順、Lua スクリプトを呼び出す方法を解説します。

Lua スクリプトファイルの呼び出し

hello.lua を C++ プログラム中から呼び出してみましょう。

dofile.cpp

#include <lua.hpp>
#include <iostream>

using namespace std;


int main(int argc, char *argv[])
{
  static_cast<void>(argc);
  static_cast<void>(argv);

  // Lua の初期化
  lua_State* lua = lua_open();
  luaL_openlibs(lua);

  // Lua ファイルを読み出して実行
  if (luaL_dofile(lua, "hello.lua")) {
    // エラー時のメッセージ表示
    string error_message = lua_tostring(lua, -1);
    cout << "luaL_dofile: " << error_message << endl;
    exit(1);
  }

  cout << "hello in C++" << endl;
  return 0;
}

実行結果

hello in lua
hello in C++ 

hello.lua にて print() を printf() などにしてエラーを発生させた場合の実行結果

hello.lua:1: attempt to call global 'printf' (a nil value) 

簡単ですね。
エラー処理がないと、Lua スクリプト内でエラーがおきたときに、何も表示されないので注意しましょう。


Lua スクリプト内の関数の実行

Lua スクリプト内の関数を呼び出す方法を示します。

Luabind を利用する場合

Luabind を用いて C++ から Lua スクリプト内の関数を呼び出す手順は、以下の通りです。

以下、サンプルプログラムです。
hello_function.lua 内の hello() を C++ から呼び出しています。詳細は Luabind のページ(英語) をご覧ください。

callFunction.cpp

#include <luabind/luabind.hpp>
#include <lua.hpp>
#include <iostream>

using namespace luabind;
using namespace std;


int main(int argc, char *argv)
{
  static_cast<void>(argc);
  static_cast<void>(argv);

  // Lua, Luabind の初期化
  lua_State* lua = lua_open();
  luaL_openlibs(lua);
  luabind::open(lua);

  // Lua スクリプトのロード
  if (luaL_dofile(lua, "hello_function.lua")) {
    string error_message = lua_tostring(lua, -1);
    cout << "loadL_dofile: " << error_message << endl;
    exit(1);
  }

  try {
    call_function<void>(lua, "hello");

  } catch (const error &e) {
    static_cast<void>(e);
    cout << "call_function: " << lua_tostring(lua, -1) << endl;
  }

  return 0;
}

実行結果

hello in lua 

読み出し済みの Lua スクリプト内に関数が存在しない場合の実行結果

call_function: attempt to call a nil value 

簡単ですね。
Luabind を用いるとコンパイルが遅くなるので、Lua スクリプトを呼び出す関数は専用のソースファイルにまとめて分割コンパイルしましょう。


指定文字列の実行

Lua の関数を用いて C++ から直接 Lua スクリプトを呼び出します。

dostring.cpp

#include <lua.hpp>
#include <string>
#include <iostream>

using namespace std;


int main(int argc, char *argv[])
{
  static_cast<void>(argc);
  static_cast<void>(argv);

  // Lua の初期化
  lua_State* lua = lua_open();
  luaL_openlibs(lua);

  // Lua スクリプトを直接実行
  if (luaL_dostring(lua, "print(\"hello\")")) {
    // エラー時のメッセージ表示
    string error_message = lua_tostring(lua, -1);
    cout << "luaL_dofile: " << error_message << endl;
    exit(1);
  }

  return 0;
}

簡単ですね。
ただ、頻繁に呼び出す箇所の実装では「処理時間の問題からこの関数を使わない方がよい」という意見もあります。必要に応じて処理時間を計測しておくことをお勧めします。


コメントページ


参考



Generated on Mon May 18 11:11:10 2009 by  doxygen 1.5.7.1