最近准备在手机项目客户端中使用lua, 之前一直在服务器使用luabind. 另外, tolua++也体验过, LuaPlus也在早年用过. 如下是本人对这些绑定库的我的感受:html
luabindlinux
利用boost机制把绑定作到极致, 比较适合主c++, 弱lua的脚本框架.ios
做者已经中止更新, 在windows/linux编译没问题, 可是在ios的LLVM下, 没法编译c++
tolua++git
像cocos2dx使用tolua++也是能够理解的, 那么多函数须要绑定, tolua++的头文件parse及自动代码生成节约了不少手动绑定的时间.github
可是看到代码中有一部分bugfix就心存不安(纯我的感受, 本人使用很少, 欢迎砖头伺候),另外, tolua++只能由脚本层驱动C++, 而没有将已经实例化的句柄注册到lua的功能也是煞笔啊windows
LuaPlus服务器
接口较为简单, 适于初学者上手, 无任何的模板, 性能不高框架
luaBridge函数
项目地址: https://github.com/vinniefalco/LuaBridge
手册: http://vinniefalco.com/LuaBridge/Manual.html
纯头文件实现, 无需编译, 包含进入工程便可, 接口简洁高效
相比luabind, 惟一不能实现的经常使用功能就是枚举, 可是能够支持类成员静态变量注册, 这个就无所谓了, 手写一个枚举支持也很简单
看下演示代码:
class A { public: A( ) { } virtual void foo( int a ) { printf("foo base\n"); } std::string Member; }; class B : public A { public: virtual void foo( int a ) { printf("foo inherited\n"); } };
void foo( int b ) { }
luabridge::getGlobalNamespace(L) .beginClass<A>("Sobj") .addConstructor<void (*) (void)> () .addFunction("foo", &A::foo) .addData("Member",&A::Member) .endClass() .deriveClass<B, A>("SSec") .addFunction("foo",&B::foo ) .endClass(); luabridge::getGlobalNamespace(L).addFunction("foo", foo ); B ins; ins.Member = "data"; luabridge::setGlobal(L, ins, "ins");
lua侧的代码
local a = Sobj()
a:foo(2)
a.Member = "hello"
ins:foo(3)