luabind: не может получить доступ к глобальной переменной
У меня есть класс C++, к которому я хочу предоставить доступ в скрипте lua через глобальную переменную, однако, когда я пытаюсь использовать его, я получаю следующую ошибку:
terminate called after throwing an instance of 'luabind::error'
what(): lua runtime error
baz.lua:3: attempt to index global 'foo' (a nil value)Aborted (core dumped)
Мой скрипт Lua (baz.lua) выглядит так:
-- baz.lua
frames = 0
bar = foo:createBar()
function baz()
frames = frames + 1
bar:setText("frame: " .. frames)
end
И я сделал простой и короткий (как я мог) main.cpp, который воссоздает эту проблему:
#include <memory>
#include <iostream>
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
#include <boost/ref.hpp>
#include <luabind/luabind.hpp>
class bar
{
public:
static void init(lua_State *L)
{
using luabind::module;
using luabind::class_;
module(L)
[
class_<bar>("bar")
.def("setText", &bar::setText)
];
}
void setText(const std::string &text)
{
std::cout << text << std::endl;
}
};
class foo
{
public:
foo() :
L(luaL_newstate())
{
int ret = luaL_dofile(L, "baz.lua");
if (ret != 0) {
std::cout << lua_tostring(L, -1);
}
luabind::open(L);
using luabind::module;
using luabind::class_;
module(L)
[
class_<foo>("bar")
.def("createBar", &foo::createBar)
];
bar::init(L);
luabind::globals(L)["foo"] = boost::ref(*this);
}
boost::reference_wrapper<bar> createBar()
{
auto b = std::make_shared<bar>();
bars_.push_back(b);
return boost::ref(*b.get());
}
void baz()
{
luabind::call_function<void>(L, "baz");
}
private:
lua_State *L;
std::vector<std::shared_ptr<bar>> bars_;
};
int main()
{
foo f;
while (true) {
f.baz();
}
}
Это скомпилировано с:
g++ -std=c++11 -llua -lluabind main.cpp
Я обнаружил, что если я поставлю bar = foo:createBar()
в baz()
функция, то это не ошибка, поэтому я предполагаю, что я не инициализирую глобальные переменные в глобальном пространстве имен правильно? Я пропускаю функцию luabind, которую мне нужно вызвать, прежде чем я смогу это сделать? Или это просто невозможно...
Спасибо!
1 ответ
Ты бежишь baz.lua
прежде чем зарегистрировать какие-либо глобальные. Положить dofile
Команда после регистрации ваших привязок.
Последовательность следующая:
- Вы вызываете конструктор foo в C++, который
- создает состояние Lua
- работает
lua.baz
- регистрирует ваши привязки
- тогда в с ++ вы вызываете f.baz.