QT中使用Lua

1 篇文章 0 订阅

参考: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测试

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值