Вызов функции 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);
        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': попытка вызвать нулевое значение

2 ответа

В этой статье я собрал пример встраивания lua 5.2 в консольный проект Visual Studio 2005 с исходным кодом, Расширение приложения C++ с Lua 5.2.

Вам действительно не имеет смысла вызывать main() из вашего lua-скрипта, так как main() является точкой входа для вашего приложения, и есть вещи инициализации Lua, которые вам нужно сделать, и сделать это можно только один раз.

Пример и статья, которую я собрал, показывают использование Lua 5.2 с C++ и возможность вызова функций C, которые вы создаете из своего сценария Lua. В примере также показан вызов функций Lua из программы на C++.

Я сделал это около года назад, используя Visual Studio 2005. Я подозреваю, что переход с Visual Studio 2005 на 2012 будет простым. Я не уверен, насколько просто было бы портировать на другой компилятор и среду разработки. Как минимум, функцию _tmain(), используемую с консольным приложением Windows в Visual Studio 2005, необходимо переименовать в main().

Пытаться luaL_dofile вместо luaL_loadfile,

Это одна из самых частых ошибок: luaL_loadfile загружает файл, но не запускает его; он просто оставляет в стеке функцию, представляющую загруженный файл, готовый к вызову. Функция main будет определяться только при запуске скрипта, то есть когда вызывается функция скрипта. Сообщение об ошибке пытается сказать вам об этом. (Я предполагаю, что ваш скрипт определяет функцию с именем main, В этом нет особой необходимости, но это безвредно.)

Другие вопросы по тегам