Lua5.3简单的C扩展示例以及与OpenResty(LuaJIT)的兼容编译
来源:互联网 发布:苹果变声软件 编辑:程序博客网 时间:2024/04/25 20:08
Lua5.3简单的C扩展示例以及与OpenResty(LuaJIT)的兼容编译
上篇文章在OpenResty的LuaJIT环境下编译了简单的C扩展示例和LuaSQL,这次我们在标准的Lua官方标准版本Lua5.3下编译这个C扩展……
之所以没有随着上一篇文章中写出来,而是采用另发一篇博文来补充的原因是……我刚刚才编译并测试成功……
编译时总是报“luaL_register”的reference找不到……我看了一下lua到处的函数中,确实找不到这个函数了……
这个函数可能是在lua5.1中有,但是在5.3中去掉了……这可怎么办?
我参考了LuaSQL-odbc的实现,发现它没有调register,而是直接返回一个表就行了……
我参照LuaSQL-odbc注册的实现,修改了上篇文章中提到的的hello.c:
#include "lua.h"#include "lauxlib.h"#include "lualib.h"static const char* dohello(const char* src){printf(src);return "I'm OK!";}static int l_hello(lua_State* lua){const char *src = NULL;src= luaL_checkstring(lua, 1);//出栈获取源字符串const char * des = dohello(src); //somethinglua_pushstring(lua, des); //压栈返回给luareturn 1; //告诉lua返回了一个变量}//映射表,"doHello"为lua中的函数名,l_hello为真正C中的函数地址static const struct luaL_Reg libhello[] = {{"doHello", l_hello},{NULL, NULL},};//模块注册函数int luaopen_hello(lua_State* lua){//注册本模块中所有的功能函数,hello为模块名,libhello数组存储所有函数的映射关系//luaL_register(lua, "hello", libhello);lua_newtable (lua);luaL_setfuncs (lua, libhello, 0);return 1;}
其实只改了一处,那就是把luaL_register改成了一个带函数成员的表了……
当然,还是在MinGW环境下编译命令:
gcc lua53.dll hello.c --share -o hello.dll
编译出hello.dll文件……
测试效果如何呢?打开lua.exe略微试了一下,感觉还不错:
Lua 5.3.3 Copyright (C) 1994-2016 Lua.org, PUC-Rio> hello = require("hello")> r = hello.doHello("run~~~~\n")run~~~~> print(r)I'm OK!> for k,v in pairs(hello) do print(k..":"..tostring(v)) enddoHello:function: 6240126c
那么返回头来,再将这种写法放回OpenResty的luaJIT中编译看看如何?
那么,还是MinGW,把hello.c放入OpenResty目录中(把上次的删掉),执行编译
gcc lua51.dll hello.c --share -Iinclude\luajit-2.1 -o hello.dll
结果发现又报找不到luaL_setfuncs的引用……我又用资源编辑器打开lua51.dll看了一下,发现果然没有这个函数……
那么原来的LuaSQL是如何编译成功的呢?结果我再次查看LuaSQL的源码,发现了luaL_setfuncs函数的定义,看了一下宏,原来5.1版本没有这个函数,这个函数是从5.2开始加上的……而这个函数的实现也是从5.2中拷出来的……那么我们加入这一段后再次编译hello.c :
#if !defined LUA_VERSION_NUM || LUA_VERSION_NUM==501/*** Adapted from Lua 5.2.0*/void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {luaL_checkstack(L, nup+1, "too many upvalues");for (; l->name != NULL; l++) {/* fill the table with given functions */int i;lua_pushstring(L, l->name);for (i = 0; i < nup; i++)/* copy upvalues to the top */lua_pushvalue(L, -(nup + 1));lua_pushcclosure(L, l->func, nup);/* closure with those upvalues */lua_settable(L, -(nup + 3));}lua_pop(L, nup);/* remove upvalues */}#endif这次终于编译成功了~当然输出结果是几乎一样的:
LuaJIT 2.1.0-beta2 -- Copyright (C) 2005-2016 Mike Pall. http://luajit.org/JIT: ON SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse> hello = require("hello")> r = hello.doHello("run~\n")run~> print(r)I'm OK!> for k,v in pairs(hello) do print(k..":"..tostring(v)) enddoHello:function: 0x004c7cc8
然后再把修改后的hello.c返回来放到Lua5.3中编译测试,一样能够成功,不再重复描述了……
这样终于能将Lua5.3和OpenResty的LuaJIT的C扩展库兼容了……分享出来,希望大家的研究过程能比我更顺利……
- Lua5.3简单的C扩展示例以及与OpenResty(LuaJIT)的兼容编译
- 通过编译luaSQL调用ODBC连接Access以及给OpenResty(LuaJIT)编写简单的C扩展示例
- nginx静态编译luajit (openresty)
- Building openresty1.7.10.1 with luajit on windows using Cygwin, 在windows下用Cygwin下编译带Luajit的openresty
- 编译lua5.3扩展.so文件时遇到的一些问题总结
- openresty 应用打包并使用luajit编译lua代码实现简单加密
- LuaJIT与C
- openresty php luajit
- Lua5.3 与C交互学习(一)
- Lua5.3遇到的坑
- OpenResty--搭建简单的CC防护
- 用C语言扩展Python的示例
- Lua5.1的元方法__call的使用示例
- Lua5.1的元方法__call的使用示例
- SDL以及扩展库的交叉编译
- C++与Lua5.3.2的相互调用
- 如何编译安装Lua5.3,实现调用C共享库
- 在python中使用c语言扩展模块的简单示例
- 机器学习之线性回归及sklearn和tensorflow代码示例
- Android性能优化之电量优化
- JSTL标签(1)
- 第一章 .Net——ASP.NET Web.config
- JSF 原理简要介绍
- Lua5.3简单的C扩展示例以及与OpenResty(LuaJIT)的兼容编译
- 设计模式的六大原则
- EC016 串口转can bus、GPIO 芯片方案介绍
- 最短路径(6)--poj3259(最短路应用-求负权回路)
- Mac Sublime图标更改
- 工厂方法模式(Factory Method)
- AOI软件中通用的金面检测方法框架
- 【操作记录】CentOS编译安装nginx
- Lucene---查找的实现