2

我正在使用 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 来编译它。

4

2 回答 2

1

所以这已经很晚了,但如果其他人遇到类似的问题,希望它会有所帮助。基本上,您的示例缺少一个重要但微妙的部分,这将有助于解释您为什么会遇到链接错误。

测试类.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

测试类.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);

文档在这个问题上不是很有帮助,但是如果您查看相关的测试源文件,它们与文档的结合足以解决大多数问题。

于 2016-05-18T17:45:35.857 回答
0

最好将有关图书馆的问题发布到邮件列表 oolua.org/mailinglist

查看该库的文档,特别是导出类函数[1]。就个人而言,我会为您的函数使用极简 DSL 而不是表达,这将使您的代理函数如下所示(但是 get 应该是一个常量函数):

OOLUA_MFUNC(setTestMember)
OOLUA_MFUNC(getTestMember)

[1] https://docs.oolua.org/_o_o_lua_proxying.html

于 2015-07-19T20:35:11.413 回答