首页 文章

C从Lua脚本调用函数

提问于
浏览
1

我正试图在我的应用程序中绑定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': %s\n", lua_tostring(lua, -1));
        return 1;
    }

    lua_close(lua);

    return 0;
}

我的输出是:

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

2 回答

  • 2

    我整理了一个将lua 5.2嵌入到本文中的Visual Studio 2005控制台项目的示例,其中包含source,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() .

  • 2

    请尝试 luaL_dofile 而不是 luaL_loadfile .

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

相关问题