C++调用Lua

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


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即可看到结果:

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值