参考:https://blog.csdn.net/smile_tom/article/details/46703865
http://www.bubuko.com/infodetail-977513.html
一、下载lua的dll和源码
1、https://joedf.ahkscript.org/LuaBuilds/ 可以下载到3个文件:Lua的依赖库dll、解释器lua.exe、编译器luac.exe
2、https://www.lua.org/ftp/ 可以下载到lua的源码,解压后里面有个src文件夹,就是源码了。
二、lua上手初体验
1、在命令提示符窗口直接运行lua命令
(1)准备
①我的lua.exe放在了E盘的lua文件夹,打开cmd窗口,执行e:切换到e盘,然后执行cd e:\lua进入文件夹,再执行lua.exe或者lua,就进入了lua命令模式。
②上述步骤略显繁琐,我们也可以直接双击lua.exe,直接启动lua的命令窗口
③最正宗的步骤既不是上述①也不是②,而是添加环境变量,依次打开->系统属性->环境变量->系统变量->PATH,然后点击“编辑”按钮,在弹出的路径条目中,添加你自己的lua.exe所在的文件夹路径,注意路径之间要用分号隔开。这样在cmd的任何目录下都可以直接执行lua命令了
(2)按照上述三种方法的任意一种,在cmd中执行:lua,即可看到打印出了lua的版本信息:
这时可以直接执行lua的命令了,例如:
按ctrl+c可以退出lua命令模式
(3)从文件中执行lua,或者说执行lua脚本文件
① 新建一个文本文档,输入:print("hello"),然后另存到E:\hello.lua
② 在cmd窗口执行:
如果没有设定环境变量,执行上述命令时,就必须用lua.exe的全路径,例如:E:\Lua\lua.exe E:\hello.lua
三、QT与lua结合
1、准备工作
首先要编译出lua的链接库,其实就是个.a文件,步骤如下:
QT -> 文件 -> 新建文件或项目 -> Library -> c++库,弹出的窗口中选择类型为”静态链接库“(非必须),输入自定义的项目名,点下一步,直到完成。然后删除自动生成的两个源文件和头文件。
在左侧的目录树中,右击工程名,选择->添加现有文件,然后选择我们前面下载的src文件夹中的所有文件,除了lua.c和luac.c,添加完成后的样子是这样的:
然后选择release模式,右击项目名,选择->构建,这样就能在release文件中生成一个.a文件。
2、正式开始
(1)新建一个QT控制台工程,然后,把上面生成的.a文件(我的文件名为libLua.a)和源码文件夹src(实际上我们只需要保留src文件夹中的3个头文件即可,其他文件可以都不要,因为它们都已被编译进.a文件中了)都复制到该工程目录下,如下图:
然后,在工程的,pro文件中添加包含路径,和.a库文件路径,
INCLUDEPATH += E:\chengxu\QT\lua_teat\lua_teat\src # lua源码路径
LIBS += E:\chengxu\QT\lua_teat\lua_teat\libLua.a # .a库文件路径
(2)把下载的lua的依赖库dll文件拷贝到工程目录下/debug目录下(最终打包时要和exe放在同一目录)
(3)新建一个add.lua文件,文件内容为:
function add(x,y)
return x + y
end
(4)把QT的main.cpp更换为:
#include <QCoreApplication>
#include <stdio.h>
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
lua_State *L;
int luaadd(int x,int y)
{
int sum;
/*the function name*/
lua_getglobal(L,"add");
/*the first argument*/
lua_pushnumber(L,x);
/*the second argument*/
lua_pushnumber(L,y);
/*call the function with 2 arguments, return 1 result.*/
lua_call(L,2,1);
/*get the result.*/
sum = (int)lua_tonumber(L,-1);
/*cleanup the return*/
lua_pop(L,1);
return sum;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
printf("QT start\r\n");
L = luaL_newstate();//新建lua解释器
luaL_openlibs(L);//载入lua基础库
//执行lua脚本:
luaL_dofile(L,"add.lua");//这里要填实际的add.lua文件的相对路径
/*call the add function*/
int sum = luaadd(10,15);
printf("sum = %d\r\n", sum);
/*cleanup Lua*/
lua_close(L);
return a.exec();
}
运行结果为:
这样我们就可以随时更改add.lua中的内容,而不用重新编译Qt程序了。
注意:QT在debug阶段,和发布exe的阶段,调用外部文件的路径有所不同,具体地说就是,举个例子:我们编译出的QT程序luaTest.exe需要读取add.lua文件,也需要lua53.dll文件等,在debug阶段,这些文件必须放到build-```debug目录下,如下图:
而在最终打包exe时,这些文件应当放到和exe同一文件夹下,上图中,exe在debug文件中,而add.lua放在了在debug文件夹的外面,一定要注意这一点。
所谓最终要把add.lua和exe放到同一文件夹下,这一点也不是绝对的,这要看程序是怎么写的,在本例的代码中:
luaL_dofile(L,"add.lua"),这句话的意思是add.lua就在exe所在的目录中,如果写"lua_code\add.lua",那就是说add.lua位于lua_code文件夹中,这个点比较基础,不要忘了^_^
注意:如果QT调用的lua文件语法有误,那么QT会报错,停止运行,所以,在调用lua文件前,一定要确保lua文件没有语法错误,一般可以通过两种方法来定位语法错误,①通过在线lua测试,②通过命令行lua.exe测试