一、lua调用c模块总结
1.c函数库成为lua的一个模块
主要做法:将包含c函数的代码生成库文件 linux下是.so windows下是.dll
同时拷贝到lua运行环境的bin下(由于我用的是LuaTool运行环境 所以放在bin下 程序运行默认从bin下找)
这样lua解析器才可以找到.dll文件
2.编写c模块
(1)先编写需要注册的c函数 这些c函数用统一的声明并且必须写为static 返回置为int
(2)定义luaL_Reg结构体 这个结构体数组用来因为注册到Lua模块中
luaL_Reg结构体的第一个字段为字符串 在注册时通知lua该函数的名字
第二个字段为函数指针
最后一个永远为NULL 用来标记结尾
(3) __declspec(dllexport)将函数、类等声明为导出函数,供其它程序调用,作为动态库的对外接口函数、类等
这个函数非常重要 如果没有 将来生成的.dll不能够被lua模块找到
(4)向lua中注册上述的表格
(5)C相关的API
- typedef struct lua_State lua_State lua解释器
- typedef int (*lua_CFunction)(lua_State *L) 能够别Lua调用的C函数必须是这种规则 函数的返回值int值表示C函数返回值的个数
- void lua_pushcclosure(lua_State*L,lua_CFunction fn ,int n) 将一个C必包压栈 fn C函数指针 n 函数关联的upvalue的个数 首先将upvalues依次压栈 然后调用该函数 将C函数压栈 并将n个upvalues出栈
- void lua_pushcfunction(lua_State*L,lua_CFunction fn )将c函数压栈 接收一个c函数的指针 然后将Lua.function类型的对象压栈
- void lua_register(lua_State*L,const char *name, lua_CFunction f) 注册C函数为一个全局变量
- void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);
注册函数到栈顶的表中;
参数l:luaL_Reg列表,记录了要注册的函数信息,注意,该列表以{NULL, NULL}结尾;
nup参数:upvalue的个数,如果不为0,则注册的所有函数都共享这些upvalues;
先将table压栈,然后将upvalues依次压栈,然后调用该函数进行函数注册。注册完毕后upva