C ++从Lua脚本调用函数

时间:2013-08-21 23:00:42

标签: c++ function lua lua-5.2

我正在尝试在我的应用程序中绑定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值

2 个答案:

答案 0 :(得分:2)

我在本文中使用源代码Extending a C++ Application with Lua 5.2汇总了一个将lua 5.2嵌入到Visual Studio 2005控制台项目中的示例。

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

答案 1 :(得分:2)

尝试使用luaL_dofile代替luaL_loadfile

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