以下为授权转载的一盎司科技公众号文章
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即可看到结果: