首页 > 其他分享 >Qt 如何搭建Lua的运行环境

Qt 如何搭建Lua的运行环境

时间:2024-03-14 11:33:27浏览次数:21  
标签:Qt lua debug Lua PWD release DIR 搭建

一、Lua简介

Lua 是一种强大的、高效的、轻量级的、可嵌入的脚本语言。它支持过程(procedural)编程、面向对象编程、函数式编程以及数据描述。Lua 是动态类型的,运行速度快,支持自动内存管理,因此被广泛用于配置、脚本编写等场景。

二、Lua的优势

Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML、ini等文件格式,并且更容易理解和维护。 Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译、运行。 一个完整的Lua解释器不过200k,在所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

三、Qt + Lua 环境搭建

Lua是用标准C编写的,所以几乎常见的编程环境它都能编译Lua。下载源码包后,直接编译即可。

1、 下载Lua

下载地址:https://www.lua.org/ftp
在这里插入图片描述

2、 使用QtCreator编译lua.a库

打开QtCreator,新建项目 > Library > C++库,在后续弹出的窗口中选择 Statically Linked Library,根据向导完成项目的创建,然后删掉由向导添加的头文件和源文件。将除了lua.c和luac.c以外的文件加入到你的开发环境中进行编译即可。(文末有对应的pro文件,可以参考一下。)
ps:lua.c 和 luac.c 中都有main函数,需要分别编译这两个文件。其中,lua.c编译出来是解析器,luac.c编译出来是编译器。

四、在Qt中调用Lua

1、 新建一个math.lua文件,内容如下:

function fn_add(x,y)
    return x + y
end

function fn_subtract(x,y)
    return x - y
end

function fn_multiply(x,y)
    return x * y
end

function fn_divide(x,y)
    return x*1.0 / y
end

2、Qt调用Lua的测试代码

新建Qt控制台程序,在该控制台程序的pro文件,配置一下lua库的头文件以及库文件路径:

CONFIG(debug, debug|release){
    DESTDIR = $$PWD/../bin/debug
    OBJECTS_DIR += $$PWD/../obj/debug
    DIR_NAME = debug
}
CONFIG(release, debug|release){
    DESTDIR = $$PWD/../bin/release
    OBJECTS_DIR += $$PWD/../obj/release
    DIR_NAME = release
}
INCLUDEPATH  += $$PWD/./3rdparty/libLua/include
LIBS += -L$$PWD/./3rdparty/libLua/lib/$${DIR_NAME}/ -lliblua

控制台main.cpp的代码如下:

#include <QCoreApplication>
#include <stdio.h>
extern "C"{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}

lua_State *L;
double luaMath(std::string fname, int x, int y)
{
    /* 要调用一个函数请遵循以下协议:
     * 首先,要调用的函数应该被压入栈,接着把需要传递给这个函数的参数按正序压栈,
     * 这是指第一个参数首先压栈。最后调用一下 lua_call,当函数调用完毕后,
     * 所有的参数以及函数本身都会出栈,而函数的返回值这时则被压栈。*/

    double result;
    /*获取函数名*/
    lua_getglobal(L, fname.c_str());

    /*压入第一个参数*/
    lua_pushnumber(L, x);

    /*压入第二个参数*/
    lua_pushnumber(L, y);

    /*使用2个参数调用函数,返回1个结果。*/
    lua_call(L, 2, 1);

    /*获取结果*/
    result = (double)lua_tonumber(L,-1);

    /*清理返回结果*/
    lua_pop(L, 1);

    return result;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    L =  luaL_newstate();//新建lua解释器
    luaL_openlibs(L);//载入lua基础库

#if 1
    //执行lua脚本:
    luaL_dofile(L, "lua/math.lua");//填写实际的math.lua文件的相对路径

    /*call the add function*/
    int sum = luaMath("fn_add", 10, 15);
    printf("sum = %d\r\n", sum);

    int subtract = luaMath("fn_subtract", 10, 15);
    printf("subtract = %d\r\n", subtract);

    int multiply = luaMath("fn_multiply", 10, 15);
    printf("multiply = %d\r\n", multiply);

    auto divide = luaMath("fn_divide", 10, 15);
    printf("divide = %.3f\r\n", divide);
#endif

    /*cleanup Lua*/
    lua_close(L);

    system("pause");
    return a.exec();
}

3、输出结果

sum = 25
subtract = -5
multiply = 150
divide = 0.667

五、附上lua库的pro文件内容:

QT -= gui

TEMPLATE = lib
CONFIG += staticlib

CONFIG += c++11

#去掉生成空的debug和release目录
CONFIG -= debug_and_release

# 编译时临时文件路径
RCC_DIR += $$PWD/../temp/rcc_tmp
MOC_DIR += $$PWD/../temp/moc_tmp
UI_DIR  += $$PWD/../temp/ui_tmp

CONFIG(debug, debug|release){
    DESTDIR = $$PWD/../lib/debug
    OBJECTS_DIR += $$PWD/../obj/debug
    DIR_NAME = debug
}
CONFIG(release, debug|release){
    DESTDIR = $$PWD/../lib/release
    OBJECTS_DIR += $$PWD/../obj/release
    DIR_NAME = release
}

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    lapi.c \
    lauxlib.c \
    lbaselib.c \
    lcode.c \
    lcorolib.c \
    lctype.c \
    ldblib.c \
    ldebug.c \
    ldo.c \
    ldump.c \
    lfunc.c \
    lgc.c \
    linit.c \
    liolib.c \
    llex.c \
    lmathlib.c \
    lmem.c \
    loadlib.c \
    lobject.c \
    lopcodes.c \
    loslib.c \
    lparser.c \
    lstate.c \
    lstring.c \
    lstrlib.c \
    ltable.c \
    ltablib.c \
    ltm.c \
    lundump.c \
    lutf8lib.c \
    lvm.c \
    lzio.c

HEADERS += \
    lapi.h \
    lauxlib.h \
    lcode.h \
    lctype.h \
    ldebug.h \
    ldo.h \
    lfunc.h \
    lgc.h \
    ljumptab.h \
    llex.h \
    llimits.h \
    lmem.h \
    lobject.h \
    lopcodes.h \
    lopnames.h \
    lparser.h \
    lprefix.h \
    lstate.h \
    lstring.h \
    ltable.h \
    ltm.h \
    lua.h \
    lua.hpp \
    luaconf.h \
    lualib.h \
    lundump.h \
    lvm.h \
    lzio.h

# Default rules for deployment.
unix {
    target.path = $$[QT_INSTALL_PLUGINS]/generic
}
!isEmpty(target.path): INSTALLS += target

#拷贝头文件到include目录下
win32 {
    SrcIncludeDir = $${PWD} #定义的宏变量,在非首位置使用时需要带{}
    SrcIncludeDir = $$replace(SrcIncludeDir, /, \\)
    DstIncludeDir = $$PWD/../include/
    DstIncludeDir = $$replace(DstIncludeDir, /, \\)
    #多条命令语句之间可以用&&隔开,自动连续执行
    QMAKE_POST_LINK += echo "---------prepare to copy *.h---------" && echo.
    QMAKE_POST_LINK += cd $$SrcIncludeDir &&  xcopy /s/y/i $$SrcIncludeDir\lauxlib.h $$DstIncludeDir
    QMAKE_POST_LINK += &&  xcopy /s/y/i $$SrcIncludeDir\lua.h $$DstIncludeDir
    QMAKE_POST_LINK += &&  xcopy /s/y/i $$SrcIncludeDir\luaconf.h $$DstIncludeDir
    QMAKE_POST_LINK += &&  xcopy /s/y/i $$SrcIncludeDir\lualib.h $$DstIncludeDir

    #打印测试
    #message("--SrcIncludeDir= $$SrcIncludeDir")
    #message("--DstIncludeDir= $$DstIncludeDir")
}

标签:Qt,lua,debug,Lua,PWD,release,DIR,搭建
From: https://blog.csdn.net/hellokandy/article/details/136619092

相关文章

  • Qt6.0开发 第四章 常用界面组件的使用
    第四章常用界面组件的使用在Qt类库中,所有界面组件类的字节或间接父类都是QWidget.QWidget的父类是QObject与QPaintDevice.所以QWidget是多重继承的类.QObject支持元对象系统,其信号与槽机制为编程中对象间通信提供了极大便利.QPaintDevice是能使用QPainter类在绘图设备上绘......
  • 搭建TS环境遇到的问题
    1、npm安装TS后,查看TS版本,执行tsc-v报错信息为一个for循环解决方法:原因是nodejs的版本太低,升级nodejs的版本即可解决 2、vscode中执行:终端->运行任务->typescript->tsc:监视-tsconfig.json,报错:typeScript解决报错tsc:无法加载文件D:\node\nodejs\node_global\tsc.p......
  • HADOOP完全分布式搭建(饭制版)
    HADOOP完全分布式搭建(饭制版)1.虚拟机安装安装系统点击VMwareWorkstation左上角文件,新建虚拟机选择自定义,点击下一步点击下一步选择稍后安装操作系统(后续我们使用的操作系统为CentOS7),点击下一步客户机系统选择Linux,版本选择CentOS764位,点击下一步自定义安......
  • DVWA 靶场搭建
    文章目录1DVWA简介2DVWA安装1DVWA简介DVWA(DamnVulnerableWebApp)是一个基于“PHP+MySQL”搭建的Web应用程序,皆在为安全专业人员测试自己的专业技能和工具提供合法的环境,帮助Web开发者更好地理解Web应用安全防范的过程DVWA一共包括十个模块:(1)BruceForc......
  • 3.2 RK3399项目开发实录-初次使用的环境搭建(物联技术666)
    通过百度网盘分享的文件:嵌入式物联网单片…链接:https://pan.baidu.com/s/1Zi9hj41p_dSskPOhIUnu9Q?pwd=8qo1提取码:8qo1复制这段内容打开「百度网盘APP即可获取」1.用户和密码1.1.UbuntuDesktop系统UbuntuDesktop系统开机启动后,自动登录到firefly用户。如果......
  • mac 本地搭建Larval + node 项目
    一、服务端+前段代码 二、安装环境2.1开发环境版本准备PHP7.4.3MySQL5.7.37node14.17.6npm6.14.11cnpm6.1.1 2.2.1mac本地安装brew工具/bin/bash-c"$(curl-fsSLhttps://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"2.2.2brew安装p......
  • Python简介与环境搭建
    文章目录前言简介Python环境搭建手动添加系统环境变量PyCharm安装创建一个项目安装汉化插件前言  本专栏用来记录个人学习Python的过程,也希望大家可以通过该专栏轻松入手Python。废话不多说,就让我们开始吧。简介  Python由荷兰国家数学与计算机科学研究中心......
  • QT TCP通信介绍
    QT是一个跨平台的C++应用程序开发框架,它提供了一套完整的工具和库,用于开发各种类型的应用程序,包括图形用户界面(GUI)应用程序、命令行工具、网络应用程序等。QT提供了丰富的功能和类来简化网络通信的开发,其中包括TCP通信。TCP通信是一种可靠的、面向连接的通信协议,它在网络中......
  • centos7.9搭建ES8.12+Kibana8.12
    学习来源https://blog.csdn.net/fen_fen/article/details/124596440 一、创建ES用户groupaddesuseradd-gesespasswdes二、下载安装包https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.12.2-linux-x86_64.tar.gz三、将下载好的包上传到安装机......
  • Windows Server 各版本搭建终端服务器实现远程访问(03~19)
    一、WindowsServer2003左下角开始➡管理工具➡管理您的服务器,点击添加或删除角色点击下一步 勾选自定义,点击下一步蒂埃涅吉终端服务器,点击下一步 点击确定重新登录后点击确定点击开始➡管理工具➡计算机管理,展开本地用户和组,点击组可以发现有个组关门用来远程......