主要內容轉載自:子龍山人博客(強烈建議去子龍山人博客完全學習一遍)
部分內容查閱自:《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模塊》
