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