C++调用Lua

C++ 调用 Lua 函数 Lua 作为一门脚本语言,可以作为 “配置文件”、“动态逻辑脚本” 等角色作用于宿主程序。1. Lua 会处理语法细节,后续维护简单,并且可以有注释。2. 可以编写逻辑,达到复杂的配置。如果我们的程序需要进行一些 “下发配置” 时,一般会考虑选择 “json”、“文件” 等形式。但是如果 “配置” 内容较为复杂,则可以考虑 Lua 了,具体可以查看以下分享。Github传送门(如果对你有所帮助或喜欢的话,赏个star吧,码字不易,请多多支持)如果觉得本篇博文对你有所启发或是解决了困惑,。 阅读详情

以下为授权转载的一盎司科技公众号文章


Lua是一个简洁、轻量、可扩展的脚本语言,由标准C编写而成,Lua脚本可以很容易被C/C++代码调用。

接下来将简单介绍Lua的C API,包括变量获取,函数调用等常用操作,详细说明可参考官网https://www.lua.org的说明。

示例代码地址:

GitHub地址:https://github.com/iounce/lua-cpp-demo

Gitee地址:https://gitee.com/iounce_admin/lua-cpp-demo

环境

  • Windows操作系统:Windows10(21H2,19044.1766)

  • C++开发环境:Visual Studio 2022社区版

  • Lua:5.4.6

二进制安装

直接在官网下载页面下载二进制文件,解压后将目录添加到系统环境变量Path之中,方便调用lua命令。也可以直接下载源码后编译生成exe文件,这里直接编译源码。

源码安装

  • 编译:下载源码后,解压到指定目录D:\application\lua\lua-5.4.6\src,然后打开Visual Studio命令行工具,执行如下命令手动编译(供参考,可根据实际修改):

  • cl /MD /O2 /c /DLUA_BUILD_AS_DLL *.c

  • ren lua.obj lua.o

  • ren luac.obj luac.o

  • link /DLL /IMPLIB:lua5.4.6.lib /OUT:lua5.4.6.dll *.obj 

  • link /OUT:lua.exe lua.o lua5.4.6.lib 

  • lib /OUT:lua5.4.6-static.lib *.obj

  • link /OUT:luac.exe luac.o lua5.4.6-static.lib

图片

图片

  • 设置环境变量:复制dll和exe文件到上一次目录,然后添加目录到环境变量Path之中:

图片

图片

验证

安装完成并添加环境变量后,执行Lua命令验证:

图片

初始化

首先调用函数luaL_newstate()创建虚拟栈,后续所有操作将在这个虚拟栈上完成。然后调用函数luaL_openlibs()加载Lua库,避免出现加载库函数失败的情况。

图片

释放资源

完成虚拟栈上的所有操作后,需要调用lua_close()函数清理环境。

图片

加载脚本

加载脚本可调用luaL_loadfile()函数,需要将脚本完整名称加入参数中(包含后缀)。然后,调用lua_pcall()函数执行脚本,也可以使用luaL_dofile()函数合二为一。

图片

获取变量

在demo.lua脚本新增变量api_version,然后通过lua_getglobal()函数读取此变量,再通过调用lua_tostring()函数获取变量值。

图片

图片

获取函数

在demo.lua脚本新增函数say_hello(),然后通过lua_getglobal()函数读取此函数,通过lua_pcall()执行函数,然后调用lua_tostring()函数获取变量值。

图片

图片

设置函数参数

在demo.lua脚本新增函数show_message(),然后通过lua_getglobal()函数读取此函数。

此函数有两个参数,第一个整型,通过lua_pushinteger()函数设置。另外一个是table,需要通过lua_newtable()创建table,再调用lua_pushstring设置key和value,最后调用lua_settable()添加到table之中。

接着通过lua_pcall()函数执行此函数,然后调用lua_tostring()函数获取变量值。

图片

图片

调用函数

一般调用lua_pcall()函数来实现函数调用,其第一个参数为虚拟栈,第二个参数为入参个数,第三个参数为返回值个数,第四个参数为自定义函数,一般设置为空即可。注意设置参数个数和返回值个数,避免出现调用失败的情况。

编译

这里直接调用命令行编译,类似C++调用Python,此处执行以下命令(可按照实际路径调整):

cl /I D:\application\lua\lua-5.4.6\src main.cpp D:\application\lua\lua-5.4.6\src\lua5.4.6.lib

图片

运行结果

直接执行可执行程序main.exe即可看到结果:

图片

Lua: C++调用Lua 按照这个链接中的方法做的,具体过程略有不同 https://blog.youkuaiyun.com/freebazzi/article/details/31419835 一、将Lua源码做为静态库导入VS 1,新建一个Win32控制台应用程序 2,点击下一步,到应用程序设置界面 类型选择:静态库 附加选项:去掉预编译头 点击完成 3,添加Lua源码 首先打开Lua的源代码压缩包,解压,其中有doc,src,makefile和readme四个文件,src就是source的缩写,打开src。 Lua的底层其实是C语言 阅读详情

相关推荐

C/C++调用lua实现原理

一、运用lua脚本与C++结合的优势 lua作为一种脚本语言,在与C++程序配合使用时,有着很大的优势,尤其在为C++程序做参数解析时,更新通信数据格式时,无需更改C++代码进行重新编译,只需要更改lua脚本程序即可。 lua与C/C++的数据通信是基于共享内存,即lua堆栈实现的,这使得lua程序在与C++程序混合使用时,还存在一个对于C/C++程序的一个天然优势,就是在lua内部不需要进行

yxli_2018的博客 1万+

Lua 和 C++ 互相调用

一、Lua与C++的交互机制——Lua堆栈1)交互机制Lua和C++ 的交互机制的基础在于Lua提供了一个虚拟栈,C++ 和Lua之间的所有类型的数据交换都通过这个栈完成。无论何时C想从Lua中调用一个值,被请求的值将会被压入栈,无论何时C想要传递一个值给Lua,首先将整个值压栈,然后就可以在Lua中调用。 栈中每个元素都能保存任何类型的Lua值(实际上Lua的任何类型的值包括字符串、表等等,最终...

哲学天空的博客 5919

cocos2dx之C++调用Lua

一.c++调用Lua 1.引入头文件 #include "cocos2d.h" #include "CCLuaEngine.h" USING_NS_CC; using namespace std; extern "C"{ #include "lua.h" #include "lualib.h" #include "lauxlib.h" } 2.调用函数     lua_St

人生如游戏,不如做游戏, 7491

C++中使用lua脚本

还是因为项目的原因,需要在C++中使用到lua脚本,使用到的就是普通的lua库,可以在这里下载。 1. 项目中导入lua模块 创建工程后,在项目中导入lua模块,一个是lua的头文件,还有就是lua的lib库 关于lib库,比较简单的使用方式就是直接使用这个以-static结尾的静态库即可,比较方便,无需其他操作。 2. 使用 先创建一个lua脚本,比较简单,就定义了一个字符串、一个表格、两个函数(一个有参,一个无参)。如下: mystr = "I'm lua" myTable = {name = "

“时光清浅,不觉多年”的博客 6311

Lua:lua调用C++

接上一篇文章:C++调用Lua 本文在上一篇文章的基础上,使用Lua调用C++。使用文章:https://zhuanlan.zhihu.com/p/96848521 的方法。 本文的Lua版本为5.3.5 Lua调用C++ 具体过程为: 1,Lua调用C++中的函数Average 2,Average返回结果给Lua #include <stdio.h> #include <string.h> #include <iostream> extern "C" { #inclu

weixin_42111061的博客 1332

lua调用C++函数

       实际上,我们早就在无形中用到过这个概念了。比如我们在lua的脚本中使用过print函数。由于lua本身就是用C语言实现的,所以lua的print函数也只是调用了C语言的fwrite函数而已。稍后我们会从源码的角度来看一下这个实现,现在首先来说说怎么让lua调用C++的函数。        首先要明确一点,就是lua和C++之间的交互依然是通过栈来实现的,通过栈进行数据交互。那么我...

yulijuanxmu的博客 2001

【走进Lua的世界之六】Lua调用C++函数

这篇文章,我们将来介绍Lua何如调用C++的函数。

三十画生 一个北漂的人 1661

Lua 调用 C++ 函数

从前面分享的 “C++ 调用 Lua 函数” 文章知道,C/C++ 调用 Lua 函数时,是需要按照规则,将参数和函数压入栈中,然后通过lua_pcall或lua_call调用,最终再通过栈获取 Lua 返回的值。同样 “Lua 调用 C++ 函数” 也需要遵循一定规则,而不是所有的 C/C++ 函数均可以进行调用。需要将 C/C++ 函数进行注册,将函数地址提供给 Lua 进行调用。交互过程同样使用了与 C/C++ 调用 Lua 函数时相同类型的栈。

江澎涌的博客 408

Lua调用C++

Lua调用C++Lua调用C++具体过程为:Lua部分的代码如下:运行结果程序运行时栈內变化回到C++调用Lua上述是读取过程,然后可以在C++中修改table中的值lua调用C++函数一、C++的函数定义二、注册函数三、C模块四、luaL_openlibs源码解析 Lua调用C++ 原文链接:https://blog.youkuaiyun.com/weixin_42111061/article/details/110310412 接上一篇文章:C++调用Lua 本文在上一篇文章的基础上,使用Lua调用C++。使用文

宁静致远的博客 5100

C++编程调用LUA脚本

静态语言C,C++,JAVA等虽然效率比脚本语言好很多,但是脚本语言在某些具体应用方面比静态语言方便很多。lua脚本被认为是最快的轻量级脚本,在游戏编程方面表现特别突出。但 一、安装配置脚本 我使用的IDE是VS2010,下面就介绍VS2010下的lua脚本配置。 安装 lua for windows 我下载的版本是5.1 地址:http://code.google.com/p/luafor

mazhle的专栏 853

R爬虫RSelenium环境搭建及简单应用

这是鄙人自己实践的一种可行的环境搭建,我会尽量详细的写下大家步骤。

weixin_44349986的博客 2013

简单C++调用lua函数及C++和lua相互函数调用小例子

http://blog.youkuaiyun.com/ym012/article/details/7191932 //简单C++调用lua函数,改自网络 //test.cpp [cpp] view plaincopy #include   extern "C" {  #include "lua.h"  #include "lualib.h"  #include "lauxlib

~。~||| 1万+

VTK实战笔记(1)在win11搭建VTK-9.4.2 + qt5.15.2 + VS2019_x64开发环境

Visual Studio 2019 + qt5.15.2 + vtk9.4.2

心向阳光,斗志昂扬! 975

菜鸟入门之lua与c++相互调用(包含多个demo)

前两篇文章中,已经介绍了使用vs2010编译lua5.1源码生成lua.lib 和 vs项目中使用c++调用lua,可以保证demo在vs上运行起来了。这里再详细介绍下c++和lua之间的相互调用以及原理。 c++与lua直接的调用,实际上通过一个栈结构来传递数据,该栈结构栈顶的索引值为-1,向栈底方向索引值依次为-1 ,-2......栈顶索引为1.栈结构里可以放函数,表,字符串,整形等各种l

继续沉淀! 4279

Crossformer实战:从零开始搭建多变量时间序列预测模型(附ETTh1数据集调参指南)

本文提供了从零开始搭建Crossformer多变量时间序列预测模型的实战指南,并附有详细的ETTh1数据集调参攻略。文章深入解析了Crossformer的核心设计,重点探讨了seg_len和win_size等关键参数对模型性能的影响,并分享了环境配置、训练调试及常见问题的解决方案,帮助开发者高效应用这一前沿深度学习模型。

weixin_29281915的博客 317

施耐德EcoStruxure平台深度体验:IEC 61499在智慧物流中心的真实应用案例解析

本文深度解析施耐德EcoStruxure平台在智慧物流中心的应用,重点探讨IEC 61499标准如何通过分布式控制和功能块技术重构自动化逻辑。通过上海某物流中心的真实案例,展示了该平台在提升系统弹性、降低停机成本方面的显著成效,为工业自动化转型提供实践参考。

weixin_30576827的博客 66

c++调用lua文件

1.Lua文件 function func() print("aaaaaa") end func() width=800 height=600 background={r=1,g=0,b=0} function f(x,y) return x+y end 2.c++文件 #include #include #include #include #include us

Ben的博客 1248

RAP 语义键:让 UUID 世界变得可读、可导航、可校验

RAP 语义键的核心价值与实现要点 语义键(Semantic Key)是 ABAP RAP 模型中连接技术实现与业务体验的关键设计:通过为实体指定一组业务可读的标识字段(如订单号、物料编码等),在保持技术主键(如UUID)不变的同时,显著提升用户界面的可读性和导航体验。 主要优势: 提升UI可读性:Fiori元素会突出显示语义键字段,帮助用户快速识别关键业务数据 改善导航体验:OData URL会使用可读的语义键而非技术ID,便于分享和排查问题 降低沟通成本:业务人员能准确引用有意义的业务标识而非技术ID

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 155

将C++对象导出到lua,C++和lua的相互调用

此例演示了如何将C++对象导出到lua,并且可以在lua脚本中给这个导出对象添加新方法。C++所编写的对象方法和lua脚本所编写的对象的方法在两种语言中都可以互相调用。此例演示了如下特征:导出方法写在Lunar::RegType Account::methods[]数组中Register函数将导出对象的方法存储在lua的全局表中,key为对象的类名称。push函数在lua栈上创建一个userd

asmc51的专栏 1万+

解决 maven编译项目-Fatal error compiling: 无效的目标发行版: 21 -> [Help 1]

惊奇的发现,maven没有用环境变量中设置好的JAVA_HOME目录,至此发现错误原因,原来执行java -version默认使用系统环境变量JAVA_HOME,而maven优先使用了windows的用户变量JAVA_HOME(这里之前忘记修改,仍然指向java8路径),修改用户变量JAVA_HOME指向java21或删除该用户变量JAVA_HOME(如无它用)后即可。打开maven包所在的目录,在maven的配置文件 mvn.cmd 文件中,设置java_home的目录。

litlit023的专栏 1799

2023华为od机试C卷【启动多任务排序】C++ 实现

一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则立刻开始执行,如果同时有多个任务要执行,则根据任务名称字母顺序排序。

MISAYAONE的博客 887

Lua调用C++函数

1.调用C函数 C文件 //对于被Lua调用的函数必须符合typedef int (*lua_CFunction)(lua_State* L)格式 //其中返回值是返回值的个数 #ifdef _cplusplus extern "C"{ #endif int add(lua_State* L) { int a = lua_tonumber(L,1); int b = lua_tonumber(L,2); lua_pop(L,2); lua_pushnumber(L,a+b);

像个博客 2132

极智AI | 谈谈为什么卷积加速更喜欢 NHWC Layout

本文主要讨论一下为什么卷积加速更加喜欢 NHWC 的数据排布。

极智视界 2970
上一篇: C++调用Python(二)
下一篇: Python生成C++类工具
iounce
博客等级 码龄18年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值