2010-02-02 68 views
5

現在再使用GCC時,我得到神祕的錯誤是這樣的:調試虛函數錶鏈接器錯誤

未定義參考「虛函數表的類名」

當它不被丟失的庫造成的,這種不可─非常具有描述性的錯誤信息總是讓我通過逐行挖掘代碼文件來找到虛擬功能的缺失實現。有沒有辦法讓鏈接器告訴我哪個虛函數丟失了,也許是一個標誌或什麼的?或者它可能告訴我,但我不明白它說的是什麼?

回答

2

gcc faq

當編譯C++,鏈接器說我 構造函數,析構函數或虛擬 表是不確定的,但我定義 他們

的ISO C++標準規定 必須定義 不是純虛擬類的所有虛擬方法, 但不需要任何診斷 違反此規則 [class.virtual]/8。在此基礎上 假設,GCC將僅發射 隱式定義的構造函數,所述 賦值運算符,析構函數 和一類在 虛擬表翻譯單元定義其 第一個這樣的非內聯方法。

因此,如果您未能定義此特定方法,則鏈接程序可能會抱怨缺少對明顯不相關的符號的定義 。 不幸的是,爲了改進 這個錯誤信息,它可能是 需要更改鏈接器,而 這不能總是完成。

的解決方案是確保不在純所有 虛擬方法被定義 。請注意,即使已聲明 pure-virtual [class.dtor]/7,也必須定義析構函數 。

,我採取的解決方案是搜索類名,並尋求虛擬方法聲明,並檢查是否有任何定義。我沒有找到任何其他解決方案。