Lua调用cpp函数的两种办法

⌚Time: 2024-03-07 20:52:25

👨‍💻Author: Jack Ge

使用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脚本


--导入库模块

TestFuncLib = require("TestFuncLib")

--调用库函数

TestFuncLib.func_01()

TestFuncLib.func_02()

之后运行lua脚本,成功的调用了c++函数


>lua5.1 "C:\script.lua"

func_01 is run

func_02 is run