我們搭建好了整個的專案環境,現在,我們一起探索一下如何將lua寄宿到c++中。
我們在luawithcpptest專案下,檢視source.cpp**如下:
#include
#include
usingnamespace std;
extern"c"
;
void testlua();
int main()
void testlua()
}
lua_close(l);
}其中,被extern "c"包起來的是lua的主要函式的宣告。在c++中,每個嵌入的lua的生命週期與各自的lua_state物件一一對應。通過lual_newstate()方法,我們便建立了乙個lua直譯器。隨後的幾個luaopen_*方法,都是獲取相應lua庫的使用權,最後通過lual_openlibs開啟所有的有使用權的lua標準庫。一切準備就緒後,我們開始接收輸入。
我們通過lual_loadstring,將所有**讀入lua,並且檢查**是否有語法錯誤。然後通過lua_pcall,執行**,將所有的全域性變數儲存在_g中。通過讀取、執行這兩步,我們就建立起乙個自己的lua直譯器了。
從檔案讀取lua**,流程與之前的示例一樣,僅是將lual_loadstring()換成lual_loadfile()即可。**如下:
現在,我們在lua中定義變數,並且賦值。然後在c++中取值,運算出結果。在lua檔案中,內容如下:
在c++中,我們獲取a,b兩個變數的值,然後相加,算出結果:
#include
#include
usingnamespace std;
extern"c"
;
void testlua();
int main()
void testlua()
else
}
int a = 0;
int b = 0;
// 獲取a的值
lua_getglobal(l, "a");
if (!lua_isnumber(l, -1))
a = lua_tonumber(l, -1);
// 獲取b的值
lua_getglobal(l, "b");
if (!lua_isnumber(l, -1))
b = lua_tonumber(l, -1);
cout << "a = "<< a << " b = "
<< b << endl;
cout << "a + b = "<< a + b << endl;
lua_close(l);
}最後的得到結果如下:
將檔案載入lua後,我們通過lua_getglobal()方法,將想要獲得的lua值放入棧頂(棧為何物,下篇分析),然後用lua_isnumber(l, –1)來檢測棧頂的元素是否是number,若果是,呼叫lua_tonumber(l,-1)來將棧頂的值傳遞給c++變數,整個流程為:1、將欲獲得的lua值放入棧中;2、檢測棧中的值是否ok;3、取出棧中的值。lua有一系列的lua_is*()來檢測棧中的值是否是相應的*型別,相應的,也有一系列的lua_to*()來取值:
寫這篇的時候,我內心比較糾結,在內容的深度上把握不准,最終我的定位是:這系列只描述兩者之間互動的步驟、方式,不深入去描述原理。原因很簡單,因為我的水平有限。在自己水平不足的情況下,去描述c++與lua內在的互動原理,會誤導人。我目前的大綱是:第一篇搭建環境;第二篇描述c++呼叫lua的一些資料;第三篇講解c++與lua之間的棧,主要還是偏重c++**呼叫lua**。第四篇描述lua如何呼叫c++**。第五篇介紹工具tolua++。以上。
C 與Lua互動(二)
c 與lua的之間函式的相互呼叫 1.c 調lua函式 c與lua的所有互動都是通過乙個棧來完成的。我對前面提到的虛擬機器l的理解是,它就是乙個棧 可能理解的不對 然後通過對這個棧的操作來實現資料的互動。呼叫函式跟訪問變數其實差不多,前面都是做一樣的事,只是呼叫函式時獲取的變數是函式名。然後將需要的...
C 與Lua的互動
c 呼叫lua用 luainte ce.dll lua呼叫c 用luanet.dll 他們之間的互動主要就是靠這兩個庫檔案,需要把渣兩個檔案剛到vs工程下的debug資料夾下。using luainte ce using system using system.collections.generic...
C 與Lua互動原理
具體步驟 1,找到cocos自帶的繫結工具指令碼檔案genbindings.py,在cocos工程的frameworks cocos2d x tools tolua這個目錄下,把這個檔案開啟。2,在開啟的genbindings.py檔案下面找到這麼一段 這裡就是執行這個指令碼會自動生成lua繫結 的...