標籤:return hang www. file ace 狀態 相同 null 研發
本來這些文章都是在我的個人網站www.zhangyi.studio,目前處在備案狀態,暫時訪問不了,所以搬到這邊。
最近這兩天需要弄清楚C++和lua間相互調用和資料傳遞,廢話不多說,直接上過程。
首先是環境環境,Linux(Debian),安裝lua,注意需要管理員權限。
sudo apt-get install lua5.2
安裝完後輸入lua或者lua -v 嚴重是否安裝成功以及安裝的版本,當然,有了lua運行環境還不夠我們還需要安裝lua開發庫既然我們安裝的是lua5.2那麼開發庫同樣安裝成5.2版本,命令如下:
sudo apt-get install liblua5.2-dev
當然,lua的環境準備好了,既然要研究lua和C/C++的互動,那gcc/g++是必不可少的,至於怎麼安裝,此處略過,預設認為已安裝好。
那麼接下來就得寫代碼驗證一下,因為lua是一種解釋性語言,它不不同於C/C++,且兩者之間不能直接做資料互動,需要一種類似於“棧”的結構來實現資料互動,規定是:C/C++有C/C++的環境,lua有lua的環境,兩張互不干擾,如需互動資料,雙方都要把資料放入“棧”中;並且lua和C/C++的資料類型也不相同,所以不能直接從棧中拿來使用。以下說明一種最典型的lua資料類型-table,如下:
1 //Data.lua2 Data =3 {4 name = "zhang_yi" ,5 age = 24 ,6 homepage = "zhangyi.studio" ,7 lover = "lijuanxian" ,8 }
假設我現在要用當前檔案Data.lua中讀取某個元素,例如name元素,一般有如下幾個步驟:
1 //建立luaState 2 lua_State *L = luaL_newstate(); 3 4 //載入lua檔案,dofile是載入並執行檔案,結果是產生全域table 5 luaL_dofile(L ,"Data.lua"); 6 7 //將我們需要處理的table置於棧頂,此時全域變數Data的index為-1(棧頂) 8 lua_getglobal(L, "Data"); 9 10 //將我們需要讀取的元素索引壓棧,此時Data的index為-2,"name"的index為-111 lua_pushstring(L, "name");12 //調用尋找介面,過程:用棧頂元素作為索引在table中尋找對應得元素,如果查到13 //POP索引(此處為"name"),把結果放到棧頂(查到的值返回到棧頂,index =-1)14 lua_gettable(L, -2);15 16 //讀取查到的結果,當然,需要先做類型判斷17 lua_isstring(L, -1)18 string str = lua_tostring(L, -1);19 20 //至此,我們便從lua指令碼的table中取得了我們想要的元素。21 //當然最後別忘了銷毀現場22 lua_close(L);
全部源碼如下:
①、Data.lua
1 --Data.lua2 Data =3 {4 name = "zhang_yi" ,5 age = 24 ,6 homepage = "zhangyi.studio" ,7 lover = "lijuanxian" ,8 }
②、cUseLua.cpp
1 //cUseLua 2 #include <iostream> 3 #include <string.h> 4 #include "mylua.h" 5 6 using namespace std; 7 8 int main() 9 {10 lua_State *L = luaL_newstate();11 if(L == NULL)12 {13 cout<<"Creat Lua State Error !"<<endl;14 return 1;15 }16 int ret = luaL_dofile(L ,"Data.lua");17 if(ret)18 {19 cout<<"Lua doFile Error !"<<endl;20 return 1;21 }22 lua_getglobal(L, "Data");23 lua_pushstring(L, "name");24 lua_gettable(L, -2);25 if(lua_isstring(L, -1))26 {27 string str = lua_tostring(L, -1);28 cout<<str<<endl;29 }30 31 lua_close(L);32 return 0 ;33 }
③、mylua.h
1 //mylua.h 2 #ifndef MYLUA_H_ 3 #define MYLUA_H_ 4 5 extern "C" 6 { 7 #include<lua5.2/lua.h> 8 #include<lua5.2/lauxlib.h> 9 #include<lua5.2/lualib.h>10 }11 #endif
最後,編譯運行
g++ -o Main main.cpp -llua5.2
通過table互動資料的目的達到了,接下來就是C/C++調用寫在lua中的函數以及lua指令碼調用C/C++介面因為lua作為一種輕量級的解釋性語言,不需要編譯連結等步驟,所以作為C/C++內嵌語言非常合適,我們在
項目研發過程中特別希望程式能經常不變,或者說不經常改動,再此,更加體現出類似於lua這種解釋性語言的魅力,一些需要經常變動的介面或者邏輯用lua來寫,然後讓主程式(C、C++)通過固定的介面來調用,這樣
便可以達到目的。
Linux下C/C++和lua互動-Table