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

ENVI5.6 批量处理GF-2/GF-6/GF-7:从安装到融合的完整自动化流程

本文详细介绍了ENVI5.6环境下批量处理GF-2/GF-6/GF-7卫星数据的完整自动化流程,包括环境配置、工具安装、正射校正、图像融合等关键步骤。通过实战案例和优化技巧,帮助用户高效完成高分卫星影像处理,提升工作效率。特别针对GF-6和GF-7的特殊处理要点进行了深入解析。

weixin_42546392的博客 179

简单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万+

记一次wireshark抓取QQ好友IP和火绒抓取微信IP

事情是这样的,,上个周,手机离奇的被盗,但没有关机,为了找回手机,粗学了一手QQ抓ip的手段。 这里我就直接做个演示,解析关键的点。 三种思路i. wireshark 抓取手机在线IPii 火绒抓取 微信在线接听IPiii 火绒抓取 微信在线不接听IP i. wireshark 抓取手机在线IP wireshark抓好友QQ的ip要求和对方打语音的时候要手机在线。 这里说一下,打语音和视频是直接能和对方建立连接,如果发文件,是直接发给腾讯的,抓不到包。 1.打开wireshark,通过电脑Tim给对方打语音

qq_29437513的博客 1万+

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

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

继续沉淀! 4279

ROS 入门教程:小乌龟仿真器和基础操作

小乌龟仿真器和ros基础操作

zlflll的博客 4125

3D美术14——max——fbx导入max后直接生成bip人形骨骼插件

最近经常会从unity里反八FBX到max里进行2次修改。 但是非常尴尬的事情就是,就是用max做的fbx,你在反导入回来,BIP骨骼都会变成预制体。这个时候有一个方法补救。那就是在导入的时候调整一下参数。(如下图) 把这里调整成设置为骨骼。就还可以了。 但是,如果你不是用max做的FBX。呵呵,那么你一定很头大,因为完全没有用。 所以,这个时候就要上插件了。 Autofbxtobip v.1.1 这个插件适用于2015及其以上版本。 在这之前我还用过一款叫BIPPY,但是效果相当感人,照着这个图片调整

qq_37576129的博客 1万+

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

基于AC算法的图像显著性检测及Matlab代码实现

以上是基于AC算法的图像显著性检测的Matlab代码实现。图像显著性检测是计算机视觉领域的一个重要任务,其目标是确定图像中最具有显著性的区域,即吸引人眼注意力的区域。图像显著性检测是计算机视觉领域的一个重要任务,其目标是确定图像中最具有显著性的区域,即吸引人眼注意力的区域。AC算法的原理基于人眼视觉系统的特性,人眼在观察图像时通常会先关注图像中的显著性区域,然后才会注意到其他细节。AC算法的原理基于人眼视觉系统的特性,人眼在观察图像时通常会先关注图像中的显著性区域,然后才会注意到其他细节。

TechPulseZ的博客 438

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

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

asmc51的专栏 1万+

SAP_FICO模块-资产减值功能对折旧和残值的影响

SAP_FICO模块-资产减值操作对资产历史折旧以及后续折旧的影响,包括减值操作的配置前提

风沙的博客 2805

dy创作者平台上传并发布视频

整体上来说不是很难,就是过程有点复杂。因为这个是别人给的单子,所以这里不放源码了。细致一点就可以搞定。如果要Signature算法,可私信,不免费。

记录一些web逆向的过程 1515

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大模型

Ollama是一个开源项目,致力于简化大型语言模型(LLM)的本地部署过程。它允许用户在自己的硬件上运行和测试最新的语言模型,无需依赖云服务。Ollama提供了一个类似于OpenAI的API接口,使得开发者可以轻松地在自己的应用程序中集成大型语言模型。此外,Ollama WebUI为用户提供了一个友好的界面,用于管理和与模型进行交互。

xiaoli8748的专栏 2379
上一篇: 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、付费专栏及课程。

余额充值