在C++应用中通过Luabind使用lua脚本(一)
2009-12-21 01:52
791 查看
本文直接介绍用luabind中绑定lua函数的过程,至于luabind、boost和lua的安装,请参考官方网站。
在lua_State函数库中注册函数的步骤为:
1.luabind::open(L)用于打开一个库,多次打开将抛出异常;
2.定义luabind::module(L),然后在[]运算符中把每条def加进去,如果是全局或静态函数,写法为:
def("functionname",&function)
如果有多个函数需要注册,则用逗号连接起来。这些看上去不像C++语法,实际上,它是C++语法的,只不过用了[]运算符,逗号运算符,后边,如果定义了类的成员函数,还要用到“.”运算符,其工作原理是用def函数返回一个scop结构,然后将这个结构通过[]运算符交给由luabind::module(L)定义的临时的module_类型的变量。
以下是luabind sample的hello world程序。
下边是Luaplus的方法:
缺点是:需要定义一个以LuaState类型的参数,这个函数一般无法在C++代码中使用。
luaplus有支持直接注册的方法:
float Add(float num1, float num2)
{
return num1 + num2;
}
LuaStateOwner state;
state->GetGlobals().RegisterDirect("Add", Add);
state->DoString("print(Add(10, 5))");
但LuaPlus对C++类的支持并不好,有网友编写了一个LuaPlusHelper用于注册C++类,使得C++类注册到State更容易。
直接使用lua:
比前一种方法更不方便,需要自己从L堆栈中取参数。
boost内置了一个boost python绑定库,因此在应用程序中集成python环境也很方便,更无额外安装一个pythonbind之类的库了。
另外,luabind默认是打开异常捕获的,当被调用函数抛出异常时,这个异常会被转换成luabind异常,框架程序很可能因此无法捕获到预定义类型的异常,所以建议把关掉luabind异常捕获。只捕获lua异常就够了,例如报告个语法错误或者是空指针,还是很实用的。
关闭luabind异常捕获的宏:LUABIND_NO_EXCEPTIONS
另外,luabind有充分的测试,这些测试代码都可以在源码中的test目录找到。
本人用lua,luabind,luaplus尝试过多次绑定,也试用过boostpython,虽然boost很大,但用过之后,感觉还是不错的,应用程序通常只用到其中一小部分。
另外还研究过javascript,含googlev8,以后有时间在把心得体会贴出来。本来以为应用程序中集成jsp会更好,因为程序员多啊,但由于各种原因,经过权衡最终还是选择了lua。可能以后某个项目还是会用jsp,毕竟jsp的用户群比lua要大得多。
参考网站:
http://www.lua.org/
http://sourceforge.net/projects/luabind/
http://www.boost.org/
http://luaplus.org
另外,由于经验有限,若有纰漏,还望各位看官不吝赐教。
在lua_State函数库中注册函数的步骤为:
1.luabind::open(L)用于打开一个库,多次打开将抛出异常;
2.定义luabind::module(L),然后在[]运算符中把每条def加进去,如果是全局或静态函数,写法为:
def("functionname",&function)
如果有多个函数需要注册,则用逗号连接起来。这些看上去不像C++语法,实际上,它是C++语法的,只不过用了[]运算符,逗号运算符,后边,如果定义了类的成员函数,还要用到“.”运算符,其工作原理是用def函数返回一个scop结构,然后将这个结构通过[]运算符交给由luabind::module(L)定义的临时的module_类型的变量。
以下是luabind sample的hello world程序。
extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" } #include <iostream> #include <luabind/luabind.hpp> void greet() { std::cout << "hello world!\n"; } int add(int a,int b) { return a+b; } extern "C" int init(lua_State* L) { using namespace luabind; open(L); module(L) [ def("greet", &greet), def("add",&add) ]; return 0; }
下边是Luaplus的方法:
缺点是:需要定义一个以LuaState类型的参数,这个函数一般无法在C++代码中使用。
static int greet(LuaState* state) { LuaStack args(state); if (args[1].IsNumber()) { printf("%f ", args[1].GetNumber()); } return 0; } int init(LuaState* pState) { LuaObject globalsObj = (*pState)->GetGlobals(); globalsObj.Register("greet", greet); }
luaplus有支持直接注册的方法:
float Add(float num1, float num2)
{
return num1 + num2;
}
LuaStateOwner state;
state->GetGlobals().RegisterDirect("Add", Add);
state->DoString("print(Add(10, 5))");
但LuaPlus对C++类的支持并不好,有网友编写了一个LuaPlusHelper用于注册C++类,使得C++类注册到State更容易。
直接使用lua:
比前一种方法更不方便,需要自己从L堆栈中取参数。
int Add(lua_State *L) { long a,b,c; a=lua_tonumber(L,1); b=lua_tonumberL,2); c=a+b; print(c); return 1; } int RegFunction() { lua_register(L,"AddP",Add); return 1; }
boost内置了一个boost python绑定库,因此在应用程序中集成python环境也很方便,更无额外安装一个pythonbind之类的库了。
另外,luabind默认是打开异常捕获的,当被调用函数抛出异常时,这个异常会被转换成luabind异常,框架程序很可能因此无法捕获到预定义类型的异常,所以建议把关掉luabind异常捕获。只捕获lua异常就够了,例如报告个语法错误或者是空指针,还是很实用的。
关闭luabind异常捕获的宏:LUABIND_NO_EXCEPTIONS
另外,luabind有充分的测试,这些测试代码都可以在源码中的test目录找到。
本人用lua,luabind,luaplus尝试过多次绑定,也试用过boostpython,虽然boost很大,但用过之后,感觉还是不错的,应用程序通常只用到其中一小部分。
另外还研究过javascript,含googlev8,以后有时间在把心得体会贴出来。本来以为应用程序中集成jsp会更好,因为程序员多啊,但由于各种原因,经过权衡最终还是选择了lua。可能以后某个项目还是会用jsp,毕竟jsp的用户群比lua要大得多。
参考网站:
http://www.lua.org/
http://sourceforge.net/projects/luabind/
http://www.boost.org/
http://luaplus.org
另外,由于经验有限,若有纰漏,还望各位看官不吝赐教。
相关文章推荐
- C++中使用Lua脚本 和lua中调用c的方法
- C++中使用Lua脚本 和lua中调用c的方法
- Unity使用C#通过自定义Loader加载指定目录的Lua脚本
- 安卓应用开发通过java调用c++ jni的图文使用方法
- (使用lua++)Lua脚本和C++交互(三)
- (使用lua++)Lua脚本和C++交互(三)
- 使用 SpiderMonkey 使 C++应用支持 JavaScript 脚本引擎
- 使用LuaPlus在C++项目中集成Lua脚本
- (使用lua++)Lua脚本和C++交互(四)
- C++中使用Lua脚本 和lua中调用c的方法
- 在C++中使用LUA脚本
- 【程序语言】C/C++中如何使用Lua脚本
- Linux C++ 使用LuaBind嵌入lua脚本
- 使用 SpiderMonkey 使 C++应用支持 JavaScript 脚本引擎
- C++中使用Lua脚本 和lua中调用c的方法
- C/C++中使用Lua脚本
- 使用 SpiderMonkey 使 C++应用支持 JavaScript 脚本引擎
- (三)cocos2d-x中通过lua脚本使用ccbi
- 使用 SpiderMonkey 使 C++应用支持 JavaScript 脚本引擎
- iOS中Lua脚本应用笔记二: 关于Lua在iOS的使用