使用Lua5.1.5进行的操作
方法一:
lua调用应用程序中的函数
lua脚本,调用应用程序中的计算平均值的函数
script.lua
number,sum,avg = average(10,20,30,40,50);
print("The number is ", number)
print("The sum is ", sum)
print("The average is ", avg)
c++程序的实现
#include <iostream>
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}
//计算平均值
int calculate_average(lua_State *L){
//获取栈顶的索引值,也就是参数个数
int n = lua_gettop(L);
//累加
double sum = 0;
for (int i = 1; i <= n; ++i)
{
sum += lua_tonumber(L, i);
}
//将结果放入栈中
lua_pushnumber(L, n);
lua_pushnumber(L, sum);
lua_pushnumber(L, sum / n);
//返回值代表返回结果的数量
return 3;
}
int main(){
lua_State *L = luaL_newstate(); //创建Lua状态
luaL_openlibs(L); //打开Lua库
// 将C++函数calculate_average注册到Lua中
lua_pushcfunction(L, calculate_average);
lua_setglobal(L, "average");//average代表lua使用的函数名
//等同于下面语句
//lua_register(L, "average", calculate_average);
luaL_dofile(L, "script.lua"); //执行Lua脚本
lua_close(L); //清理Lua状态
std::cin.get();
return 0;
}
运行程序,结果
The number is 5
The sum is 150
The average is 30
方法二:
将c++函数封装为动态库,作为lua模块调用
使用VS建立一个win32控制台项目,选择应用程序类型为dll的空项目

之后为项目配置好lua库编译的环境
建立一个cpp文件,包含功能函数、导出入口函数、注册lua函数
#include <iostream>
//c++使用到了c语言头文件要用extern "C"修饰
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}
//需要被调用的C++语言函数,该函数必须以C的形式被导出,因此extern "C"是必须的
extern "C" int func_01(lua_State* L)
{
std::cout<<"func_01 is run \n";
return 0;
}
extern "C" int func_02(lua_State* L)
{
std::cout<<"func_02 is run \n";
return 0;
}
//定义函数表
//结构体数组中的最后一个元素的两个字段均为NULL,用于提示Lua注册函数已经到达数组的末尾。
static const luaL_Reg TestFuncLibReg[] = {
{"func_01",func_01},
{"func_02",func_02},
{NULL,NULL}
};
//Lua库模块的入口函数
//进行注册模块
//VC++使用__declspec(dllexport)导出符号
//函数名必须为luaopen_xxx,其中xxx表示library名称。
extern "C" __declspec(dllexport) int luaopen_TestFuncLib(lua_State* L) {
luaL_register(L, "TestFuncLib", TestFuncLibReg);
return 1;//返回1表示成功注册了一个Lua模块
}
生成的的动态库名字必须要和注册的库名称一致,所以修改项目的目标文件名为库文件名

之后编译,生成dll动态库,把dll库文件放入lua的安装目录下能够让lua解释器找到

编辑lua脚本
之后运行lua脚本,成功的调用了c++函数
>lua5.1 "C:\script.lua"
func_01 is run
func_02 is run