C++从Lua脚本调用函数

C++ Calling function from Lua script

本文关键字:调用 函数 脚本 Lua C++      更新时间:2023-10-16

我正在尝试在我的应用程序中绑定Lua,现在我正在尝试测试如何将Lua绑定到C++中。我的问题很奇怪,因为我想在luaL_loadfile之后,在开始时从脚本中调用函数main()。我的代码:

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include "lua.hpp"
#include "lauxlib.h"
#include "lualib.h"
using namespace std;
int main(int argc, char **argv) {
    lua_State* lua = luaL_newstate();
    luaL_openlibs(lua);
    if (luaL_loadfile(lua, "test.lua") != 0) {
        std::cout << lua_tostring(lua, -1) << "n";
        lua_pop(lua, 1);
        return 1;
    }
    lua_getfield(lua, LUA_REGISTRYINDEX, "main");
    if (lua_pcall(lua, 0, 1, 0) != 0) {
        printf("Error running function 'main': %sn", lua_tostring(lua, -1));
        return 1;
    }
    lua_close(lua);
    return 0;
}

我的输出是:

运行函数"main"时出错:尝试调用零值

在本文中,我用源代码"用lua 5.2扩展C++应用程序"给出了一个将lua 5.2嵌入Visual Studio 2005控制台项目的示例。

从lua脚本中调用main()对您来说真的没有意义,因为main()是应用程序的入口点,而且您需要做一些lua初始化的事情,而且只需要做一次。

这个例子和我放在一起的文章展示了将Lua 5.2与C++结合使用,并能够调用您从Lua脚本中创建的C函数。该示例还显示了从C++程序调用Lua函数。

大约一年前,我使用VisualStudio2005完成了这项工作。我怀疑从VisualStudio2005到2012会很简单。我不确定移植到另一个编译器和开发环境会有多简单。Visual Studio 2005中与Windows控制台应用程序一起使用的_tmain()函数至少需要重命名为main()。

尝试luaL_dofile而不是luaL_loadfile

这是最常见的错误之一:luaL_loadfile加载文件但不运行它;它只是在堆栈上留下一个表示已加载文件的函数,随时可以调用。函数main将仅在脚本运行时定义,即在调用脚本函数时定义。错误消息试图告诉你这一点。(我假设你的脚本定义了一个名为main的函数。没有任何实际需要,但它是无害的。)