2015-07-19 20 views
2

未定義的引用我正在使用OOLUA 2.0.0並且正在接收錯誤undefined reference to OOLUA::Proxy_class<TestClass>::class_name對OOLUA :: Proxy_class <T> :: 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

我不知道OOLUA,但我猜''class_name'隱藏在'OOLUA_PROXY'宏中。 – cubuspl42

回答

0

這將是有關圖書館到郵件列表oolua.org/mailinglist

看一看該庫的文檔發佈更好的問題,特別是出口類函數[1]。個人而言,我會用極簡的DSL爲你的函數,而不是表現的,那麼這將讓你的代理功能,如下面的(但是GET真的應該是一個常數函數):

OOLUA_MFUNC(setTestMember) 
OOLUA_MFUNC(getTestMember) 

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

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 
) 

你必須始終把OOLUA_EXPORT_FUNCTIONS塊在相關的.cpp文件,以便從OOLUA_PROXY塊的聲明是定義。即使你只有const成員函數,你仍然必須放置一個空白塊,例如在.cpp文件中。如果您的課程只有靜態功能,您需要使用稍微不同的設置。

總結:

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

該文檔是不是在這個問題上非常有幫助,但如果你reveiw相關的測試源文件,它們與文件的組合足以讓過去大多數問題。