Lua和C++交互 学习记录之一:C++嵌入脚本
2016-09-19 12:04
716 查看
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍)
部分内容查阅自:《Lua 5.3 参考手册》中文版 译者 云风 制作 Kavcc
vs2013+lua-5.3.3
1.首先需要编译出lua库
①创建一个静态库工程,将lua-5.3.3里的所有文件包含到工程里面去
②进行编译就可以得到一个lua的静态库,提供给后面的测试项目使用
2.创建学习测试console项目
①引入上面步骤生成的lua静态库
②包含lua的所有头文件
③创建一个hello.lua,里面的内容只有一句
3.测试项目里的C++代码
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文件,里面可引入的库如下:
(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++注册的类》
部分内容查阅自:《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++代码
#include <iostream> //这个头文件包含了所需的其它头文件 #include "lua.hpp" static const luaL_Reg lua_reg_libs[] = { { "base", luaopen_base}, { NULL, NULL }, }; int main(int argc, char* argv[]) { if (lua_State* L = luaL_newstate()){ //注册让lua使用的库 const luaL_Reg* lua_reg = lua_reg_libs; for (; lua_reg->func; ++lua_reg){ luaL_requiref(L, lua_reg->name, lua_reg->func, 1); lua_pop(L, 1); } //加载脚本,如果出错,则打印错误 if (luaL_dofile(L, "hello.lua")){ std::cout << lua_tostring(L, -1) << std::endl; } lua_close(L); } else{ std::cout << "luaL_newstate error !" << std::endl; } system("pause"); return 0; }
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文件,里面可引入的库如下:
static const luaL_Reg lua_reg_libs[] = { { "base", luaopen_base }, { "coroutine", luaopen_coroutine }, { "table", luaopen_table }, { "io", luaopen_io }, { "os", luaopen_os }, { "string", luaopen_string }, { "utf8", luaopen_utf8 }, //{ "bit32", luaopen_bit32 }, { "math", luaopen_math }, { "debug", luaopen_debug }, { "package", luaopen_package }, { NULL, NULL }, };
(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++注册的类》
相关文章推荐
- Lua和C++交互 学习记录之八:C++类注册为Lua模块
- Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
- Lua和C++交互 学习记录之六:全局函数交互
- Lua和C++交互 学习记录之三:全局值交互
- Lua和C++交互 学习记录之四:全局table交互
- Lua和C++交互 学习记录之二:栈操作
- Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块
- Lua和C++交互 学习记录之五:全局数组交互
- lua学习系列:c++调用lua脚本的简单示例
- C++ 和lua交互学习的三个例子
- 【COCOS2DX-LUA 脚本开发之十一】C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (attempt t
- Lua和C++交互api学习
- Lua 脚本 控制 XML配置 - 之Lua学习1 ( 多维嵌套表的 C API 交互)
- Lua脚本和C++交互(一)
- Visual Sutdio2015 C++嵌入Lua脚本环境配置
- 【COCOS2DX-LUA 脚本开发之十一】C/C++与Lua之间进行数据函数交互以及解决“PANIC: unprotected error in call to Lua API (attempt t
- (使用lua++)Lua脚本和C++交互(三)
- C++ 嵌入 Lua 脚本 示例代码
- Lua脚本和C++交互(二)
- (使用lua++)Lua脚本和C++交互(三)