对OOLUA :: Proxy_class <t> :: class_name

时间:2015-07-19 06:19:59

标签: c++ lua compiler-errors oolua

我正在使用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;
}

文档here似乎没有说明此错误。我不确定class_name是什么。任何帮助表示赞赏。

顺便说一下,我正在使用GCC 4.9.2来编译它。

2 个答案:

答案 0 :(得分:1)

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

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
)

您必须始终在关联的.cpp文件中放置一个OOLUA_EXPORT_FUNCTIONS块,以便定义OOLUA_PROXY块中的声明。即使你只有const成员函数,你仍然必须放置一个空块,例如.cpp文件中的OOLUA_EXPORT_FUNCTIONS(TestClass)。如果您的类只有静态函数,则需要使用稍微不同的设置。

总结:

  • OOLUA_PROXY声明代理类
  • OOLUA_EXPORT_FUNCTIONS块定义该类的成员

此外,如果您的类只公开了静态成员函数,则需要在.cpp文件中包含OOLUA_EXPORT_NO_FUNCTIONS(TestClass)。对于每个静态成员,您必须使用特殊语法在脚本中注册静态函数。

using namespace OOLUA; //NOLINT(build/namespaces)
Script vm;
vm.register_class_static<TestClass>("aStaticMember",
    &OOLUA::Proxy_class<TestClass>::aStaticMember);

文档在这方面没有多大用处,但是如果您了解相关的测试源文件,它们与文档相结合就足以解决大多数问题。

答案 1 :(得分:0)

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

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

OOLUA_MFUNC(setTestMember)
OOLUA_MFUNC(getTestMember)

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