C++ 从 Lua 脚本调用函数

我正在尝试将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);
        返回1;
    }

    lua_getfield(lua,LUA_REGISTRYINDEX,"main");
    if (lua_pcall(lua,0,1,0)!= 0) {
        printf(“运行函数'main'时出错:%s\n”,lua_tostring(lua,-1));
        返回1;
    }

    lua_close(lua);

    返回0;
}

我的输出是:

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

点赞
用户1466970
用户1466970

本文中我提供了一个关于将 Lua 5.2 嵌入 Visual Studio 2005 控制台项目的实例,包括源代码,文章名为《使用 Lua 5.2 对 C++ 应用进行扩展》(Extending a C++ Application with Lua 5.2)。

在 Lua 脚本中调用 main() 并不合理,因为 main() 是应用程序的入口点,需要进行 Lua 初始化等操作,而且这些只需要执行一次。

我提供的示例和文章展示了如何使用 C++ 实现 Lua 5.2,并能够从 Lua 脚本中调用你所创建的 C 函数。该示例还演示了如何从 C++ 程序调用 Lua 函数。

我在大约一年前使用 Visual Studio 2005 完成了这个工作。我认为从 Visual Studio 2005 到 2012 的转换会很简单。但我不确定将其移植到另一个编译器和开发环境中是否会很简单。至少需要将 Visual Studio 2005 中用于 Windows 控制台应用的 _tmain() 函数重命名为 main()。

2013-08-21 23:16:35
用户107090
用户107090

尝试使用 luaL_dofile 替代 luaL_loadfile

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

2013-08-22 00:30:56