g++連結報錯:undefined reference to typeinfo of xxx
問題背景
在專案中遇到了這樣一個問題:C++檔案編譯都OK,但連結的時候報錯:undefined reference to typeinfo for xxx。
std::typeinfo
是C++中的RTTI(RunTime Type Identification)機制中記錄型別資訊用的,dynamic_cast
和 typeid
運算子會使用這些資訊。
虛擬函式未實現
最常見的原因就是基類的虛擬函式未實現了。由於C++類的實現可以分佈在多個原始檔中,所以生成目標檔案時,基類的虛擬函式沒有定義是不會報錯的。但是連結成可執行檔案時,需要將虛擬函式的資訊放進typeinfo中,這個時候虛擬函式未實現就會引發這個錯誤。
混用了no-RTTI程式碼和RTTI程式碼
難搞的就是這種情況。
如果混用了使用 -fno-rtti
和 -frtti
編譯的程式碼後,當程式碼中寫了建立含有虛擬函式的類的物件、使用 dynamic_cast
等時就會發生這個錯誤。
專案中我們自己寫的程式必須開啟RTTI,而我們使用的外部的一個庫使用no-RTTI編譯。我們在自己的程式碼中需要過載一個外部庫中的帶虛擬函式的類,結果連結的時候就出現了問題。外部庫中的基類使用 -fno-rtti
選項編譯,生成的程式碼沒有typeinfo資訊,而我們的程式碼使用 -frtti
選項編譯,要求基類必須要有typeinfo資訊。最後,我讓那個派生類所在的原始檔以-fno-rtti選項編譯,解決了問題。