【问题标题】:C++ Calling function from Lua script来自 Lua 脚本的 C++ 调用函数
【发布时间】:2013-08-24 12:15:32
【问题描述】:

我正在尝试在我的应用程序中绑定 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':尝试调用一个零值

【问题讨论】:

  • 您尝试做的事情完全没有意义。 main 由 C/C++ 运行时库调用,作为程序的入口点。为什么要从 lua 脚本再次调用它??
  • 为什么你会假设Lua registry 在“main”键下会有一些东西?你了解 Lua 运行时是什么(和不是)吗?

标签: c++ function lua lua-5.2


【解决方案1】:

我在这篇文章中整理了一个将 lua 5.2 嵌入到 Visual Studio 2005 控制台项目中的示例,源代码为Extending a C++ Application with Lua 5.2

从你的 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()。

【讨论】:

  • 没有luaL_dofile,有没有办法从脚本中加载任何定义的函数?
  • 我的经验是我有存储在一个或多个文件中的 Lua 块。我将各种 Lua 块加载到 Lua 引擎中,然后可以在其中使用它们,例如通过使用 lua_pcall() 或类似函数,从 C/C++ 应用程序中。我不确定您要完成的工作是什么,因此有关此的更多详细信息会很好。通常,人们将 Lua 引擎与应用程序一起使用,并提供 Lua 脚本可以调用的各种功能,以在应用程序中编写脚本或自动化功能。
  • "没有 luaL_dofile 可以从脚本中加载任何定义的函数" function() ... end 是一个语句,必须执行代码才能产生函数值。
【解决方案2】:

试试luaL_dofile 而不是luaL_loadfile

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2010-11-15
    • 2018-04-23
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多