最近準(zhǔn)備在手機(jī)項(xiàng)目客戶端中使用lua, 以前一直在服務(wù)器使用luabind. 另外, tolua++也體驗(yàn)過, LuaPlus也在早年用過. 以下是本人對(duì)這些綁定庫的個(gè)人感覺:
luabind
利用boost機(jī)制把綁定做到極致, 比較適合主c++, 弱lua的腳本框架.
作者已經(jīng)停止更新, 在windows/linux編譯沒問題, 但是在ios的LLVM下, 無法編譯
tolua++
像cocos2dx使用tolua++也是可以理解的, 那么多函數(shù)需要綁定, tolua++的頭文件parse及自動(dòng)代碼生成節(jié)約了很多手動(dòng)綁定的時(shí)間.
但是看到代碼中有一部分bugfix就心存不安(純個(gè)人感覺, 本人使用不多, 歡迎磚頭伺候),另外, tolua++只能由腳本層驅(qū)動(dòng)C++, 而沒有將已經(jīng)實(shí)例化的句柄注冊(cè)到lua的功能也是煞筆啊
LuaPlus
接口較為簡(jiǎn)單, 適于初學(xué)者上手, 無任何的模板, 性能不高
luaBridge
項(xiàng)目地址: https://github.com/vinniefalco/LuaBridge
手冊(cè): http://vinniefalco.com/LuaBridge/Manual.html
純頭文件實(shí)現(xiàn), 無需編譯, 包含進(jìn)入工程即可, 接口簡(jiǎn)潔高效
相比luabind, 唯一不能實(shí)現(xiàn)的常用功能就是枚舉, 但是可以支持類成員靜態(tài)變量注冊(cè), 這個(gè)就無所謂了, 手寫一個(gè)枚舉支持也很簡(jiǎn)單
看下演示代碼:
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側(cè)的代碼
local a = Sobj()
a:foo(2)
a.Member = "hello"
ins:foo(3)