Lua和C++交互 學習記錄之一:C++嵌入腳本


主要內容轉載自:子龍山人博客(強烈建議去子龍山人博客完全學習一遍)

部分內容查閱自:《Lua 5.3  參考手冊》中文版 譯者 雲風 制作 Kavcc

 

vs2013+lua-5.3.3

 

1.首先需要編譯出lua庫

①創建一個靜態庫工程,將lua-5.3.3里的所有文件包含到工程里面去

②進行編譯就可以得到一個lua的靜態庫,提供給后面的測試項目使用

 

2.創建學習測試console項目

①引入上面步驟生成的lua靜態庫

②包含lua的所有頭文件

③創建一個hello.lua,里面的內容只有一句

print("Hello world !")

 

3.測試項目里的C++代碼

 

 1 #include <iostream>
 2 
 3 //這個頭文件包含了所需的其它頭文件
 4 #include "lua.hpp"
 5 
 6 static const luaL_Reg lua_reg_libs[] = {  7     { "base", luaopen_base},  8  { NULL, NULL },  9 }; 10 
11 int main(int argc, char* argv[]) 12 { 13     if (lua_State* L = luaL_newstate()){ 14 
15         //注冊讓lua使用的庫
16         const luaL_Reg* lua_reg = lua_reg_libs; 17         for (; lua_reg->func; ++lua_reg){ 18             luaL_requiref(L, lua_reg->name, lua_reg->func, 1); 19             lua_pop(L, 1); 20  } 21 
22         //加載腳本,如果出錯,則打印錯誤
23         if (luaL_dofile(L, "hello.lua")){ 24             std::cout << lua_tostring(L, -1) << std::endl; 25  } 26 
27  lua_close(L); 28  } 29     else{ 30         std::cout << "luaL_newstate error !" << std::endl; 31  } 32 
33     system("pause"); 34 
35     return 0; 36 }

 

4.部分函數解析

(1)void luaL_requiref (lua_State *L, const char *modname,lua_CFunction openf, int glb);

①如果 modname 不在 package.loaded 中, 則調用函數 openf ,並傳入字符串 modname。 將其返回值置入 package.loaded[modname]。

這個行為好似該函數通過 require 調用過一樣。

如果 glb 為真, 同時也將模塊設到全局變量 modname 里。
在棧上留下該模塊的副本。

②查看lualib.h文件,里面可引入的庫如下:

 

 1 static const luaL_Reg lua_reg_libs[] = {  2     { "base", luaopen_base },  3     { "coroutine", luaopen_coroutine },  4     { "table", luaopen_table },  5     { "io", luaopen_io },  6     { "os", luaopen_os },  7     { "string", luaopen_string },  8     { "utf8", luaopen_utf8 },  9     //{ "bit32", luaopen_bit32 },
10     { "math", luaopen_math }, 11     { "debug", luaopen_debug }, 12     { "package", luaopen_package }, 13  { NULL, NULL }, 14 };

 

 

 

(2)int luaL_dofile (lua_State *L, const char *filename);

加載並運行指定的文件。 它是用下列宏定義出來:

(luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET,0))
如果沒有錯誤,函數返回假; 有錯則返回真。

 

Lua和C++交互系列:

Lua和C++交互 學習記錄之一:C++嵌入腳本

Lua和C++交互 學習記錄之二:棧操作

Lua和C++交互 學習記錄之三:全局值交互

Lua和C++交互 學習記錄之四:全局table交互

Lua和C++交互 學習記錄之五:全局數組交互

Lua和C++交互 學習記錄之六:全局函數交互

Lua和C++交互 學習記錄之七:C++全局函數注冊為Lua模塊

Lua和C++交互 學習記錄之八:C++類注冊為Lua模塊

Lua和C++交互 學習記錄之九:在Lua中以面向對象的方式使用C++注冊的類


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM