Привязка LuaJIT к C ++ с LuaBridge приводит к «ПАНИКЕ: незащищенная ошибка» - PullRequest
0 голосов
/ 02 ноября 2018

Windows 10 x64, MSVC 2017, LuaJIT 2.0.5.

Я искал в Интернете, но ответы не помогли.

В основном я пытаюсь следовать этому руководству , за исключением того, что я должен был поместить #include <LuaBridge.h> после включения Lua, потому что в противном случае это не работает, говоря, что LuaBridge должен идти после включения Lua.

Однако, я получаю следующую ошибку: PANIC: unprotected error in call to Lua API (attempt to call a nil value).

Понятия не имею, почему. Если вам нужно больше информации - просто скажите что.

#include "stdafx.h"
#include <iostream>
#include <lua.hpp>
#include <LuaBridge/LuaBridge.h>

using namespace luabridge;
using namespace std;

int main()
{
    lua_State* L = luaL_newstate();
    luaL_dofile(L, "script.lua");
    luaL_openlibs(L);
    lua_pcall(L, 0, 0, 0);
    LuaRef s = getGlobal(L, "testString");
    LuaRef n = getGlobal(L, "number");
    string luaString = s.cast<string>();
    int answer = n.cast<int>();
    cout << luaString << endl;
    cout << "And here's our number:" << answer << endl;
    system("pause");
    return 0;
}

script.lua:

testString = "LuaBridge works!"
number = 42

1 Ответ

0 голосов
/ 03 ноября 2018

Код в руководстве неисправен. lua_pcall нечего вызывать, потому что luaL_dofile и luaL_openlibs не помещают функцию в стек, поэтому он пытается вызвать nil и возвращает 2 (значение макроса LUA_ERRRUN ).

Я проверил это, изменив код из учебника и скомпилировав его с g ++. Я не получил ошибку ПАНИКИ, по любой причине; возможно потому что он использовал Lua 5.3:

#include <iostream>
extern "C" {
# include "lua.h"
# include "lauxlib.h"
# include "lualib.h"
}
#include <LuaBridge/LuaBridge.h>

using namespace luabridge;
int main() {
    lua_State* L = luaL_newstate();
    luaL_dofile(L, "script.lua");
    std::cout << "type of value at top of stack: " << luaL_typename(L, -1) << std::endl;
    luaL_openlibs(L);
    std::cout << "type of value at top of stack: " << luaL_typename(L, -1) << std::endl;
    std::cout << "result of pcall: " << lua_pcall(L, 0, 0, 0) << std::endl; // Print return value of lua_pcall. This prints 2.
    LuaRef s = getGlobal(L, "testString");
    LuaRef n = getGlobal(L, "number");
    std::string luaString = s.cast<std::string>();
    int answer = n.cast<int>();
    std::cout << luaString << std::endl;
    std::cout << "And here's our number: " << answer << std::endl;
}

Как вы заметили, код также неисправен, потому что заголовки Lua должны быть включены перед заголовком LuaBridge!

...