1

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

#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': %s\n", lua_tostring(lua, -1));
        return 1;
    }

    lua_close(lua);

    return 0;
}

我的输出是:

运行函数“main”时出错:尝试调用 nil 值

4

2 回答 2

2

尝试luaL_dofile代替luaL_loadfile.

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

于 2013-08-22T00:30:56.783 回答
2

在这篇文章中,我将一个将 lua 5.2 嵌入到 Visual Studio 2005 控制台项目中的示例与源代码“使用 Lua 5.2 扩展 C++ 应用程序”放在一起。

从您的 lua 脚本调用 main() 确实没有意义,因为 main() 是您的应用程序的入口点,并且您需要做一些 Lua 初始化工作,并且只做一次。

我放在一起的示例和文章展示了使用 Lua 5.2 和 C++ 并能够调用您从 Lua 脚本创建的 C 函数。该示例还显示了如何从 C++ 程序调用 Lua 函数。

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

于 2013-08-21T23:16:35.423 回答