неопределенная ссылка на OOLUA :: Proxy_class & lt; T & gt; :: class_name

Я использую 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 для его компиляции.

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);

Документация не очень полезна в этом вопросе, но если вы обнаружите связанные тестовые исходные файлы, их вместе с документацией будет достаточно, чтобы обойти большинство проблем.

1

Другие решения

Было бы лучше отправлять вопросы о библиотеке в список рассылки oolua.org/mailinglist

Посмотрите документацию для библиотеки, в частности экспорт функций класса [1]. Лично я бы использовал минималистский DSL для ваших функций вместо выразительного, тогда это сделало бы ваши прокси-функции такими, как показано ниже (однако get должен действительно быть постоянной функцией):

OOLUA_MFUNC(setTestMember)
OOLUA_MFUNC(getTestMember)
[1] https://docs.oolua.org/_o_o_lua_proxying.html

0

По вопросам рекламы [email protected]