使用LuaPlus在C 專案中整合Lua指令碼

2021-04-20 03:52:42 字數 1997 閱讀 7359

花了兩天時間,費了好大的功夫才實現了c++專案中整合lua指令碼的可行性分析。下面的工作就是去寫指令碼了,在寫指令碼之前先把c++整合lua的經驗總結一下。

luabind,確實不錯,很強大。如果不是它需要boost庫支援的話我就選它了。

tolua++,我只是粗略的看了下,因為編譯太麻煩,很快就放棄了。不過看網上評價還不錯。

並不是因為boost不好,而是因為我的專案連帶工程源**都要投遞去應聘的,不能保證對方機器上也安裝了boost庫。

最後還是選擇了luaplus,感覺還可以,下面是使用經驗總結。

1。建立乙個state。

luastateowner* pstate = null;

pstate = new luastateowner(true);

if ( !pstate )

return e_outofmemory;

注意:luastateowner構造函式引數true表示在構造的過程中對lua標準庫進行初始化。這一點非常重要。一開始我呼叫的不帶引數的建構函式,然後在.lua中呼叫math.random()的時侯就一直失敗,今天研究了一下午才弄明白的。

2. 註冊c++函式到lua

(這一點我沒試,直接引用示例裡的)

intprintlsnumber(luastate

*state)

//no return values.

return0;

} luaobject globalsobj = (*pstate)->getglobals();

globalsobj.register(

"printnumber

", printlsnumber);

3。註冊c++類成員函式到lua

luaobject globalsobj = (*pstate)->getglobals();

ctest test; //ctest為類名

globalsobj.registerdirect( "update", test, &ctest::update );

update為ctest的乙個成員函式,

雙引號中的update是指註冊到lua中的函式名,在lua指令碼中使用update()即呼叫了test物件的update()函式。

4.從檔案中載入並執行指令碼

int iret = (*pstate)->dofile( "test.lua" );

if ( 0 != iret )

return false;

返回值為0表示成功,否則不成功.

5.c++獲取lua指令碼中的變數

float x = (*pstate)->getglobal( "x" ).getfloat();

注意,要在dofile之後才能從lua中獲取變數,此時檔案已被載入。

6.c++中呼叫指令碼裡的函式

luafunctionrandbuild = (*pstate)->getglobal("randbuild");

bool ret = randbuild();

test.lua檔案中:

function randbuild()

math.random(); --第一次的隨機數太小,合棄

x = math.random( -100, 100 );

return true;

end;

7.lua指令碼中呼叫c++函式

這裡可以呼叫的就是前面註冊過的c++函式,呼叫時直接使用註冊時的函式名。

比如第3步中的,如果指令碼中寫update(),就相當於在c++中test.update();

8.c++中直接呼叫註冊的lua函式

(*pstate)->dostring( "update()" );

這一句意思是只執行"update()"這一句指令碼。

草草的寫完,有點亂,就將就著看吧。

使用LuaPlus在C 專案中整合Lua指令碼

使用luaplus在c 專案中整合lua指令碼 2008 07 16 00 02 花了兩天時間,費了好大的功夫才實現了c 專案中整合lua指令碼的可行性分析。下面的工作就是去寫指令碼了,在寫指令碼之前先把c 整合lua的經驗總結一下。luabind,確實不錯,很強大。如果不是它需要boost庫支援的...

在專案中整合測試

使用小規模測試降低風險 開發人員編寫 和缺陷 tdd是在專案中整合測試最簡便的方式 單元測試不是萬能藥 使用多種測試技巧 確定每個團隊成員在測試中的角色 測試人員稱職嗎 一流的測試人員具有足夠的創造力,編碼工作之前,就能評估系統的設計和架構 編寫 過程中,測試人員會設計和實現他們的測試元件 會衡量測...

在專案中整合ironpython以獲得二次開發能力

這裡有個鏈結,主要是講如何在ironpython裡面使用linq to objects功能 不過我除錯的時候不知道應該怎麼測試這段 pipeline defjoin outer,inner,outerkey,innerkey,fun this join return outer.ext.join o...