在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:《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模块》 《Lua和C++交互 学习记录之八:C++类注册为Lua模块》 《Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类》 |
请发表评论