如何将 C++ 函数暴露给 Lua 脚本?

我刚刚成功创建了一个 Lua 项目。(目前只有一个简单的运行 Lua 脚本的代码。)

但现在该怎么让 Lua 脚本能够使用 C++ 函数和变量呢?

比如下面这个例子:

int Add(int x, int y) {
    return x + y;
}

float myFloatValue = 6.0

我对 C++ 相当新手,所以希望这不会太难。顺便说下,这是我目前的代码:

#include "stdafx.h"
extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
}

using namespace System;

int main(array<System::String ^> ^args)
{
    lua_State* luaInt;
    luaInt = lua_open();
    luaL_openlibs (luaInt);
    luaL_dofile (luaInt, "abc.lua");
    lua_close(luaInt);
    return 0;
}
点赞
用户4323
用户4323

我建议不要使用 Lua C API,而是使用 Luabind

Luabind 是一个相对高级的库,专门用于将 C++ 类和函数暴露给 Lua。它不需要使用 Lua C API 函数,也不需要操作 Lua 堆栈等。它受 Boost Python 启发,所以如果你学会了一个库,你基本上也会用另一个库。

2013-10-15 12:34:43
用户520499
用户520499

我会选择John Zwinck的回答,因为我个人的经验表明,只使用Lua本身很麻烦。但是,如果你想知道答案,可以看看剩下的内容。

要注册C/C++函数,需要先让您的函数看起来像Lua提供的标准C函数模式:

extern "C" int MyFunc(lua_State* L)
{
  int a = lua_tointeger(L, 1); // 第一个参数
  int b = lua_tointeger(L, 2); // 第二个参数
  int result = a + b;

  lua_pushinteger(L, result);

  return 1; // 返回值的数量
}

每个需要在Lua中注册的函数都应遵循这个模式。返回类型为int,一个参数为lua_State* L,返回值的计数。

然后,您需要在Lua的注册表中注册它,以便将其暴露给您的脚本上下文:

lua_register(L, "MyFunc", MyFunc);

要注册简单变量,可以编写:

lua_pushinteger(L, 10);
lua_setglobal(L, "MyVar");

之后,您就可以从Lua脚本中调用函数了。请记住,在使用注册它们的特定Lua状态运行任何脚本之前,应注册所有对象。

在Lua中:

print(MyFunc(10, MyVar))

结果:

20

2013-10-15 12:46:15