2012-08-10 113 views
9

一些這些錯誤是通過修改C++:什麼是

virtual void draw(); 

求解以

virtual void draw() {}; 

的「未定義參照‘所屬類別爲[類名]’」比虛擬功能的其它原因但是,這些錯誤的其他原因可能是什麼?,除虛擬功能之外。 什麼可能是以下錯誤的原因:

/tmp/cciGEgp5.o:(.rodata._ZTI14CustomXmppPump[typeinfo for CustomXmppPump]+0x18): 
    undefined reference to `typeinfo for XmppPump' 
+1

也許你在構建中只有.h或.hpp文件,沒有相應的.cpp文件 – 2012-08-10 15:13:10

+0

您令人困惑的聲明和定義。 – 2012-08-10 15:18:11

+3

看起來你正在編譯沒有RTTI。請注意,未定義的引用是針對** typeinfo **而不是針對實際的虛擬功能。這是您在libjingle網站上找到的[「已知問題」](http://code.google.com/p/libjingle/issues/detail?id=143)。 – Damon 2012-08-10 15:23:06

回答

5

在GCC中,第一個非內聯虛擬方法用於確定創建vtable和typeinfo對象的翻譯單元。如果您沒有定義該方法,它會創建您看到的錯誤,因爲它期望您在某處定義該方法,並且正在等待該定義發出該類的vtable和typeinfo的輸出。

http://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html

當你改變virtual void draw();的聲明的virtual void draw() {};內聯定義,它選擇不同的功能發出的虛函數表。

+0

除非虛擬的所有定義都可見,在這種情況下,包含它的每個TU都可以得到它自己的副本(壞) – justin 2012-08-10 15:54:55

+0

@Justin:正確它會導致額外的膨脹目標代碼,必須由鏈接器清除,這可能是時間消耗。 – 2012-08-10 15:58:11

9

如果您正在使用RTTI(-frtti)進行編譯,請確保您的相關庫也是用它編譯的,而不是-fno-rtti。否則,當您使用-fno-rtti編譯的類的子類時,或者使用dynamic_cast時,將會出現typeinfo錯誤。