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

Luaの標準ライブラリをCやC++から呼び出すときの注意(メモ)

C++ メモ プログラミング

luaのみを使っている場合標準ライブラリは特にimportやらincludeやらをしなくていいのであんまり意識しない。んでC++から呼び出したときも同じ感じで特に何も指定せずでできるのかなと思ったらエラーを吐いた。

luaL_openlibs(L);

という一行を入れなくてはいけないらしい。

追記:
以下のようなテンプレートクラスを書いておくとLuaが簡単に扱えて便利。(luabindを利用している)Policyは内部クラスで適当に定義したのを指定すると特に命名とか気にせずに使える。

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

#pragma comment(lib, "lua5.1.lib")

#ifndef LUA_OBJECT
#define LUA_OBJECT


//Luaを安全、統一的に扱うためのクラス
template<class Policy>
class LuaObject{
	public:
	  LuaObject();
	  ~LuaObject();
	  void loadScript(char* FileName_) throw(std::ios_base::failure);

	  lua_State*  operator&()const{return L;}

	private:
	  lua_State *L;
			
};
/*Policyの暗黙のインターフェース
Luaへのクラスの登録処理を記述
static void enrollClass(lua_State *L);
	
Luaへの関数の登録処理を記述
static void enrollFunction(lua_State *L);
*/



//====================LuaObject Method====================

//デフォルトコンストラクタ
template<class Policy>
LuaObject<Policy>::LuaObject(){
  //LuaのVMを生成する
    L = lua_open();        
    //luabindを開く
    luabind::open(L);
  luaL_openlibs(L);
  Policy::enrollClass(L);
  Policy::enrollFunction(L);
}

//デストラクタ
template<class Policy>
LuaObject<Policy>::~LuaObject(){
  lua_close(L);
}

//loadScript
template<class Policy>
void LuaObject<Policy>::loadScript(char* FileName_) throw(std::ios_base::failure){
  int ret = luaL_dofile(L,FileName_);
  if (ret != 0) throw std::ios_base::failure(lua_tostring(L,-1));
}

#endif