当前位置: 首页 > news >正文

Qt 如何搭建Lua的运行环境

一、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
endfunction fn_subtract(x,y)return x - y
endfunction fn_multiply(x,y)return x * y
endfunction fn_divide(x,y)return x*1.0 / y
end

2、Qt调用Lua的测试代码

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

CONFIG(debug, debug|release){DESTDIR = $$PWD/../bin/debugOBJECTS_DIR += $$PWD/../obj/debugDIR_NAME = debug
}
CONFIG(release, debug|release){DESTDIR = $$PWD/../bin/releaseOBJECTS_DIR += $$PWD/../obj/releaseDIR_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 -= guiTEMPLATE = lib
CONFIG += staticlibCONFIG += 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_tmpCONFIG(debug, debug|release){DESTDIR = $$PWD/../lib/debugOBJECTS_DIR += $$PWD/../obj/debugDIR_NAME = debug
}
CONFIG(release, debug|release){DESTDIR = $$PWD/../lib/releaseOBJECTS_DIR += $$PWD/../obj/releaseDIR_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.0SOURCES += \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.cHEADERS += \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 $$DstIncludeDirQMAKE_POST_LINK += &&  xcopy /s/y/i $$SrcIncludeDir\lua.h $$DstIncludeDirQMAKE_POST_LINK += &&  xcopy /s/y/i $$SrcIncludeDir\luaconf.h $$DstIncludeDirQMAKE_POST_LINK += &&  xcopy /s/y/i $$SrcIncludeDir\lualib.h $$DstIncludeDir#打印测试#message("--SrcIncludeDir= $$SrcIncludeDir")#message("--DstIncludeDir= $$DstIncludeDir")
}

相关文章:

Qt 如何搭建Lua的运行环境

一、Lua简介 Lua 是一种强大的、高效的、轻量级的、可嵌入的脚本语言。它支持过程&#xff08;procedural&#xff09;编程、面向对象编程、函数式编程以及数据描述。Lua 是动态类型的&#xff0c;运行速度快&#xff0c;支持自动内存管理&#xff0c;因此被广泛用于配置、脚本…...

产品推荐 - ALINX XILINX FPGA开发板 Artix-7 XC7A100T-2FGG484I

01开发板介绍 此款开发板采用核心板扩展板的模式&#xff0c;方便用户对核心板的二次开发利用。FPGA使用的是Xilinx公司的ARTIX-7系列的芯片&#xff0c;型号为XC7A100T-2FGG484I。在核心板使用了2片MICRON公司的MT41J256M16HA-125 DDR3芯片&#xff0c;组合成32bit的数据总线…...

Github 2024-03-16 开源项目日报Top10

根据Github Trendings的统计,今日(2024-03-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5非开发语言项目2TypeScript项目1C++项目1Lua项目1Swift项目1《Hello 算法》:动画图解、一键运行的数据结构与算法教程 创建周期:4…...

【使用postman测试python接口】

打开python服务 设置postman如下&#xff0c;并发送&#xff1a; postman新建请求设置请求方式为post设置地址、raw、json方式、内容如下 结果&#xff1a; python如下&#xff1a; from flask import Flask, request, jsonifyapp Flask(__name__) # 实例化对象app.route…...

【C++ 】list 类

1. 标准库中的list类 list 类 的介绍&#xff1a; 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 2. list与forward_list非常相似&#xff1a;最主要的不同在于forward_list是单链表 3. 与其他的序列式容器相比(a…...

Linux下的多线程编程:原理、工具及应用(2)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;Flower of Life—陽花 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶️ ☰ …...

微信小程序-webview分享

项目背景 最近有个讨论区项目需要补充分享功能&#xff0c;希望可以支持在微信小程序进行分享&#xff0c;讨论区是基于react的h5项目&#xff0c;在小程序中是使用we-view进行承载的 可行性 目标是在打开web-view的页面进行分享&#xff0c;那就需要涉及h5和小程序的通讯问…...

webpack5零基础入门-8清空前次打包文件与处理图标字体资源

1.配置output中的clean属性为true output: {/**文件输出路径 绝对路径*///__dirname 表示当前文件的文件夹目录path: path.resolve(__dirname, dist),//所有文件的输出目录/**文件名 */filename: static/js/dist.js,//入口文件输出文件名clean: true,//在打包前将path整个目录内…...

中国首个基于区块链的分布式算力网络上线

随着美国人工智能公司OpenAI近期发布的Sora视频模型&#xff0c;全球对高性能算力的需求突破了历史新高。Sora的创新在于它能够以超长生成时间、多角度镜头捕捉&#xff0c;理解物理世界的能力&#xff0c;这不仅是技术的一大突破&#xff0c;更是对算力需求的一大挑战。在这样…...

cesiumlab中shp转3dtiles白模效果一

安装cesiumlab 如果没有安装cesiumlab&#xff0c;去官网下载安装一个即可 http://www.cesiumlab.com/cesiumlab.html 效果 步骤 1、准备shp面数据 2、打开cesiumlab软件转换 选择shp面数据 设置高度&#xff0c;如果shp面中有高度字段&#xff0c;可以用高度字段&#xff…...

照片生成数字人技术重塑虚拟主播生态

随着数字技术的飞速发展&#xff0c;虚拟主播已成为现代传媒领域的一股新势力。然而&#xff0c;传统虚拟主播形象制作周期长、成本高的问题&#xff0c;限制了其在多个场景下的广泛应用。美摄科技&#xff0c;作为业界领先的数字内容创新者&#xff0c;针对这一痛点&#xff0…...

前端和后端权限控制【笔记】

前端权限设置【笔记】 前言版权推荐前端权限设置需求效果实现资源 后端权限控制1.给所有前端请求都携带token2.添加拦截器3.配置到WebMvcConfiguration4.更多的权限验证 最后 前言 2024-3-15 18:27:26 以下内容源自《【笔记】》 仅供学习交流使用 版权 禁止其他平台发布时删…...

老电脑装什么系统流畅

对于一些老旧电脑来说&#xff0c;重装系统是提升电脑性能的最佳选择。那么&#xff0c;老电脑装什么系统流畅呢&#xff1f;推荐Windows 7系统&#xff0c;它对硬件的需求相对较低。配置较低的电脑运行Windows 7可以更好地利用系统资源&#xff0c;提高电脑的运行速度和响应能…...

厉害了!机器视觉在农业中的应用

机器视觉是一门涉及模式识别、神经生物学、计算机科学、人工智能、图像处理、心理物理学等诸多领域的交叉学科。主要是通过计算机对人类某些视觉方面的智能行为的模拟和再现,再处理并理解从客观事物的图像中提取到的信息,最终达到在实际检测和控制中应用的目的。近年来,随着…...

简述从浏览器发出请求到数据返回的全过程

下面是我结合经验概述的从浏览器发出请求到数据返回的全过程。 一、用户请求 1、用户在浏览器输入URL&#xff0c;或通过功能发起请求&#xff1b; 2、解析URL&#xff0c;提取协议(http,https等)&#xff0c;IP&#xff0c;端口&#xff0c;域名&#xff0c;路径等信息&#x…...

MongoDB性能最佳实践:硬件和操作系统配置

欢迎阅读有关MongoDB性能最佳实践的系列博文。在往期文章中&#xff0c;我们已经讨论过查询模式和性能分析、事务和读/写关注等实现大规模性能的关键考虑因素。在本篇文章中&#xff0c;我们将讨论硬件和操作系统配置。 如果您在阿里云上部署MongoDB&#xff0c;那么阿里云会为…...

mysql查询条件包含IS NULL、IS NOT NULL、!=、like %* 、like %*%,不能使用索引查询,只能使用全表扫描,是真的吗???

不知道是啥原因也不知道啥时候, 江湖上流传着这么一个说法 mysql查询条件包含IS NULL、IS NOT NULL、!、like %* 、like %*%,不能使用索引查询&#xff0c;只能使用全表扫描。 刚入行时我也是这么认为的&#xff0c;还奉为真理&#xff01; 但是时间工作中你会发现还是走索引…...

使用IDEA2023创建传统的JavaWeb项目并运行与调试

日期:2024-0312 作者:dusuanyun 文档环境说明: OS:Deepin 20.9(Linux) JDK: OpenJDK21 Tomcat:10.1.19 IDEA: 2023.3.4 (Ultimate Edition) 本文档默认已经安装JDK及环境变量的配置。 关键词…...

【快捷部署】002_Flink(1.17.2)

&#x1f4e3;【快捷部署系列】002期信息 编号选型版本操作系统部署形式部署模式002Flink1.17.2CentOS 7.Xtgz包单机 &#x1f449; 演示视频 Flink一键安装&#xff08;本地模式&#xff09; install-flink.sh 脚本内容 #!/bin/bash ####变量 ###执行脚本的当前目录 mydir$…...

智慧公厕建设,助力打造宜居、韧性、可持续的智慧城市

公共厕所作为智慧城市的重要组成部分&#xff0c;对于城市的高质量发展起着至关重要的作用。智慧公厕建设旨在通过全面监测、控制和管理公共厕所&#xff0c;实现多方面功能&#xff0c;包括公共厕所环境监测与调控、厕位占用监测与引导、消耗品监测与缺失提示、安全防范与管理…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...