Luaの標準ライブラリを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