首页 > 其他分享 >热更新—内嵌Lua

热更新—内嵌Lua

时间:2023-04-01 20:33:05浏览次数:55  
标签:内嵌 编译 lib lua 项目 C++ Lua 更新

一、Lua简介
    C++是一种编译型语言,执行效率高,但每次对程序修改都需要重新编译,当项目较大时,编译起来比较费时。
    Lua是一种用C语言编写的脚本语言,源码开源,具有体积小,效率高的特点,可嵌入到应用程序中对应用程序进行拓展。因此可将其和C++程序结合起来,既保留了C++程序的高效性,又增添了可拓展性,也便于实现程序的热更新。

二、Lua安装配置
    1.在网址(https://www.lua.org/ftp/)下载lua的源码
以lua-5.4.4为例,选择下载lua-5.4.4.tar.gz压缩包,将其解压。
    2.将lua源码编译为dll
使用Visual Studio创建一个空的动态链接库项目,将lua-5.4.4.tar.gz压缩包中的src目录下的所有文件添加到动态链接库项目中进行编译生成对应的.dll和.lib文件。
【注意事项】
    2.1将lua.c和luac.c从生成文件中排除
image
    2.2在C/C++预处理器中加入预处理定义:LUA_BUILD_AS_DLL,不加入此宏定义,则不会生成.lib文件
image

    3.将lua嵌入到自己的项目中
将lua的头文件所在目录加入到项目的附加包含目录中;将.dll和.lib文件所在目录加入到项目的附加库目录中;将.lib文件名添加项目的附加依赖项中

    完成以上步骤后,就将lua嵌入到自己的项目中了

三、利用lua实现热更
    以下写一个测试MFC的热更测试程序,界面如下:
功能主要是进行加法运算。上面三个Edit Control分别绑定double型变量m_num1,m_num2,m_num3来存储被加数、加数以及和;最下面的Edit Control绑定CString型变量m_func,用来存储lua语句;
“计算”按钮的响应函数为:

按钮响应函数
/*在此之前已经调用luaL_newstate和luaL_openlibs
分别创建了lua_State对象Lua并加载了基本库*/

UpdateData(TRUE);
//从内存中加载lua函数
luaL_loadbuffer(Lua, m_func.GetBuffer(), m_func.GetLength(), "test");
lua_pcall(Lua, 0, 0, 0);

//调用从内存中加载的函数
lua_getglobal(Lua, "add");
lua_pushnumber(Lua, m_num1);
lua_pushnumber(Lua, m_num2);
lua_pcall(Lua, 2, 1, 0);
m_num3 = (double)lua_tonumber(Lua, -1);

UpdateData(FALSE);

image

四、测试效果
image

标签:内嵌,编译,lib,lua,项目,C++,Lua,更新
From: https://www.cnblogs.com/hanpto/p/17279099.html

相关文章

  • 更新Debian源
    清华站vi/etc/apt/sources.list#默认注释了源码镜像以提高aptupdate速度,如有需要可自行取消注释debhttps://mirrors.tuna.tsinghua.edu.cn/debian/bullseyemaincontribnon-free#deb-srchttps://mirrors.tuna.tsinghua.edu.cn/debian/bullseyemaincontribnon-......
  • Git提交本地项目到云端仓库(学习理解持续更新)
    进入项目文件夹初始化本地仓库gitinit把所有文件添加到版本库中gitadd.查看添加的文件gitstatus......
  • springboot和redis执行lua脚本——踩坑
    问题:原先想使用redis执行lua脚本作为项目限流基础,lua脚本后写完后执行一直报错如下图:  卡了几天了,没看明白咋回事,一次偶然试了一下解决了,传递lua参数需要时String类型难怪说报错强转String类型异常  灵感来源参考文章:踩坑之RedisTemplate执行Lua脚本-知乎(zhihu.c......
  • C语言逆向汇编——参数局部变量、函数堆栈、调用约定和内嵌汇编码
    第一节1.1C语言1、注意参数和局部变量在堆栈中的存储方式2、参数在调用函数前就已经存入堆栈,从[EBP+8]、[EBP+C]、……开始。3、局部变量是在调用函数后,存入缓冲区里,从[EBP-4]、[EBP-8]、……开始4、函数运算得到的结果,通常存在EAX里。        第一......
  • mongodb-文档的插入、更新与删除操作
    一、文档的插入--单文档插入db.COLLECTION_NAME.insert(document)db.COLLECTION_NAME.insertOne(document)--insert也可以插入多文档db.COLLECTION_NAME.save(document)--insert与save区别--insert方法插入若文档中已存在该文档,会报错,反之写入--save方法插入若集合中已......
  • ztree 更新节点updateNode无效
    https://blog.csdn.net/qq_42190134/article/details/126174038在使用updateNode时,如果node是自行声明的数据,那么更新时会不生效。因为自行声明的数据并没有在当前树中引用,更新时无法生效。constnode={id:15,name:'总部大楼',isParent:true,}varzTree=......
  • ubuntu kernel 更新
    参考: https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel如果希望修改kernel部分的配置,如CONFIG_RT_GROUP_SCHED,打开cgroup对RT的支持,可以在debian.master/config/annotations中找到配置项,把相应平台的'n'改成‘y'  网上搜到其它文章,从kernel.org下载原始版本编译更新的......
  • xshell - 强制更新 前 备份服务器连接信息
    1.背景今天打开xshell,提示要求强制更新版本,且打不开页面,以前是关闭提示是可以打开的,那么,更新就更新吧,可我配置好的服务器连接信息不可丢2.解决我在这个路径找到了,不同的电脑位置有点差异,基本一致 ......
  • 字典列表的增加、删除、修改、更新
    a={'k1',['a','b','c'],'k2':['x','y','z']}a.setdefault('k3':['bbb','ccc']) 有效,只有'k3'不存在的情况才有效a的内容变成:{'k1',['......
  • adb 更新版本后查看adb版本无变化
    appium连接模拟器一直报错,百思不得其解,后查看adb发现版本不一致下载新版本更新了好多遍发现版本还是未变化,重启等万能大法也无用模拟器中的adb版本查看为最新的,所以我的文件肯定没有问题 执行命令查看一下adb发现C盘也有一个,不知道啥时间创建的果断删除后查看版本正常......