热更新—内嵌Lua

发布时间 2023-04-01 20:32:19作者: Hanpto

一、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