手动使用C/C++编写Lua扩展插件
来源:互联网 发布:准粒子知乎 编辑:程序博客网 时间:2024/06/16 00:23
最近在研究如何在Windows 下嵌入Lua来完成业务模块编写的时候 发现Lua的一些问题,首先Lua作为一门脚本语言,其灵活性和可扩展性是很高的,要不然Cocos2d-x中也不会嵌入他来编写业务逻辑,但是由于国内资料相当的少,很少有人去正八经研究完了之后 写一篇文章 来分享自己的成果,想要去深入理解应用一些东西得时候,显得很无力,很多Lua扩展都是直接写扩展库来完成,如果不理解原理甚至你都不会灵活运用,这就是本文写作的目的。
第一 我需要Lua嵌入我的应用程序,这一点很容易的做到。
第二 我需要使用Lua进行数据层的操作,我希望有一个类似 Java PHP中的ORM框架来完成我的Sqlite3数据库操作,但是研究来研究去发现 好坑爹,只有下面两个库还算可以。 LuaSql 已经好几年没有更新了,Github上最新的代码 都是基于Sqlite3以及Lua5.1之前的版本,另一个lsqlite3也是 ,虽然相对强悍些 ,但是 貌似文档上说 只在Linux下测试通过。。。所以面对这些坑爹问题的时候 去勉强编译这些古老的代码还不如 自己去根据sqlite3编写自己的Lua 扩展。
下面进入正题:
一步一步编写自己的Lua扩展程序,到此我假设大家已经具有Lua嵌入开发的基础 。
首先新建我们自己的DLL项目作为Lua扩展库,设置好Lua库的路径 ,头文件包含路径,之后 在扩展库项目源文件中添加入下代码 用作Lua初始化 。
extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};///打开Lua Libslua_State *GetLua(){lua_State *lua=luaL_newstate() ;luaL_openlibs(lua);return lua;}如下图
第二步骤编写 Lua 扩展原型 我这里 使用的是 兼容Lua5.1扩展方式,那么 请在Lua库以及 我们的扩展库项目添加这样我们可以使用 Lua5.1方式来扩展Lua,
当然我们也可以使用Lua5.2最新方式进行扩展 不过这都无所谓了。
下面告诉编译器 我使用 5.1兼容扩展生成 DLL共享库。
#define LUA_COMPAT_MODULE#define LUA_CORE#define LUA_BUILD_AS_DLL这个时候我么开始按照Lua的方式来编写我们的扩展库。。可以有两种方式
第一种内嵌式扩展就是直接 将扩展写到我们的应用程序中,我们开发的时候通常这么做。 而不是DLL中,代码如下 。
#define LUA_COMPAT_MODULEextern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};///打开Lua Libslua_State *GetLua(){ lua_State *lua=luaL_newstate() ; luaL_openlibs(lua); return lua;}static int extFunc(lua_State* L) { printf("i am a embed Lua Extension By Programmer小卫!\n"); return 0; } const luaL_Reg reg[]={ {"func",extFunc}, {NULL, NULL}}; LUALIB_API int luaopen_usher_luaex(lua_State *L) { //lua 函数 luaL_openlib(L, "usher", reg, 0); return 0;//没有返回值}int _tmain(int argc, _TCHAR* argv[]){ lua_State *lua=GetLua(); luaopen_usher_luaex(lua); if(0!=luaL_dofile(lua,"./luaext.lua")){ printf("load error!\n"); } return 0;}Lua测试代码如下
require("usher") //<span style="color:#FF0000;">关于require加载机制 在后续讲解</span>usher.func()
第二种 插件式扩展我们用到的好多第三方Lua扩展就是按照此种方式开发DLL扩展
代码如下:
#define LUA_COMPAT_MODULEextern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};lua_State *GetLua(){lua_State *lua=luaL_newstate() ;luaL_openlibs(lua);return lua;}static int extFunc(lua_State* L) { printf("i am a Lua Extension By Programmer小卫!"); return 0; } static const luaL_Reg reg[]={{"func",extFunc}, {NULL, NULL}}; //模块名字 dll名字//被加载器加载 extern "C" _declspec(dllexport) int luaopen_usher_luaex(lua_State *L) { //lua 函数luaL_openlib(L, "usher", reg, 0);return 0;//没有返回值}BOOL WINAPI DllMain(__in HINSTANCE hinstDLL,__in DWORD fdwReason,__in LPVOID lpvReserved){return TRUE ;}
//lua插件调用代码如下require("usher.luaex") //加载当前package.cpath下的usher\luaex.dll 插件 并且 加载入口函数从而加载 lua扩展库usher.func()
便已生成的dll我们可以发现 导出了如下函数 luaopen_usher_luaex用给lua模块进行加载
生成的扩展模块dll如下
最终运行结果如下
好了到现在开始你也可以为Lua 写 扩展库了,下一张详细分析Lua的 require 包含机制
- 手动使用C/C++编写Lua扩展插件
- 手动使用C/C++编写Lua扩展插件
- 使用 C 编写 Lua 模块
- 使用C语言扩展lua语言功能
- 编写C模块供Lua使用
- 和我一起写lua - 使用C扩展lua
- 使用VS2010编写Python的C扩展
- 使用C/C++编写Python扩展库
- [C++/Lua]开发Lua功能扩展DLL
- 如何使用Lua扩展C/C++应用系列1
- 如何使用Lua扩展C/C++应用系列2
- 如何使用Lua扩展C/C++应用系列3
- 在lua中使用C语言编写的库
- 在lua中使用C语言编写的库
- 编写PHP的C扩展
- 使用C语言编写PHP 5.5.4的扩展函数
- 扩展Python__在python脚本中使用其他语言(c/c++/java/c#)编写的模块
- 使用lua编写Wireshark的dissector插件
- sublime text2如何连接FTP/SFTP——图文详细教程
- HDU 4797 Graph Reconstruction
- spring Jdbctemplate返回插入记录的自增Id
- Candy
- IOS导航栏translucent对6plus适配的影响
- 手动使用C/C++编写Lua扩展插件
- js如何用判断鼠标的右键还是左键,屏蔽右键菜单
- poj 1065 Wooden Sticks
- Spring配置
- 查看Android模拟器的SDCard文件夹内容
- 如何重启namenode
- 网络编程socket之概念篇
- C#两个复数相加减
- 成功者总能扼制自个儿的情绪