Я использую OOLUA 2.0.0 и получаю сообщение об ошибке undefined reference to OOLUA::Proxy_class<TestClass>::class_name
,
Код является:
class TestClass
{
int test_member;
public:
void setTestMember(int x) { test_member = x; }
int getTestMember() { return test_member; }
};
OOLUA_PROXY(TestClass)
OOLUA_MEM_FUNC(void, setTestMember, int)
OOLUA_MEM_FUNC(int, getTestMember)
OOLUA_PROXY_END
int main()
{
OOLUA::Script script;
script.register_class<TestClass>();
OOLUA::run_chunk(script, "local n = TestClass.new() \n n:setTestMember(42) \n print(\"test_member is: \" .. n:getTestMember()");
return 0;
}
Документация Вот ничего не говорит об этой ошибке. Я не уверен что class_name
даже есть. Любая помощь приветствуется.
Кстати, я использую GCC 4.9.2 для его компиляции.
Так что уже поздно, но, надеюсь, это поможет, если кто-нибудь еще столкнется с подобной проблемой. По сути, в вашем примере отсутствует важная, но тонкая часть, которая поможет объяснить, почему вы получили ошибки в ссылках.
TestClass.hpp
class TestClass
{
int test_member;
public:
void setTestMember(int x) { test_member = x; }
int getTestMember() const { return test_member; }
static void aStaticMember() { }
};
OOLUA_PROXY(TestClass)
OOLUA_MEM_FUNC(void, setTestMember, int)
OOLUA_MEM_FUNC_CONST(int, getTestMember)
OOLUA_SFUNC(aStaticMember)
OOLUA_PROXY_END
TestClass.cpp
OOLUA_EXPORT_FUNCTIONS(TestClass
,setTestMember
)
OOLUA_EXPORT_FUNCTIONS_CONST(TestClass
,getTestMember
)
Вы должны всегда ставить OOLUA_EXPORT_FUNCTIONS
блок в связанном файле .cpp, чтобы объявления из OOLUA_PROXY
блок определены. Даже если у вас есть только функции-члены const, вы все равно должны поместить пустой блок, например OOLUA_EXPORT_FUNCTIONS(TestClass)
в .cpp файле. В случае, если ваш класс имеет только статические функции, вам потребуется использовать несколько иную настройку.
В итоге:
OOLUA_PROXY
объявляет прокси-классOOLUA_EXPORT_FUNCTIONS
блоки определяют члены этого классаКроме того, если в вашем классе представлены только статические функции-члены, вам необходимо включить OOLUA_EXPORT_NO_FUNCTIONS(TestClass)
в .cpp файле. Затем для каждого статического члена вы должны использовать специальный синтаксис для регистрации статических функций в скрипте.
using namespace OOLUA; //NOLINT(build/namespaces)
Script vm;
vm.register_class_static<TestClass>("aStaticMember",
&OOLUA::Proxy_class<TestClass>::aStaticMember);
Документация не очень полезна в этом вопросе, но если вы обнаружите связанные тестовые исходные файлы, их вместе с документацией будет достаточно, чтобы обойти большинство проблем.
Было бы лучше отправлять вопросы о библиотеке в список рассылки oolua.org/mailinglist
Посмотрите документацию для библиотеки, в частности экспорт функций класса [1]. Лично я бы использовал минималистский DSL для ваших функций вместо выразительного, тогда это сделало бы ваши прокси-функции такими, как показано ниже (однако get должен действительно быть постоянной функцией):
OOLUA_MFUNC(setTestMember)
OOLUA_MFUNC(getTestMember)
[1] https://docs.oolua.org/_o_o_lua_proxying.html