g++連結報錯:undefined reference to typeinfo of xxx

3的4次方發表於2024-08-30

g++連結報錯:undefined reference to typeinfo of xxx

問題背景

在專案中遇到了這樣一個問題:C++檔案編譯都OK,但連結的時候報錯:undefined reference to typeinfo for xxx。

std::typeinfo 是C++中的RTTI(RunTime Type Identification)機制中記錄型別資訊用的,dynamic_casttypeid 運算子會使用這些資訊。

虛擬函式未實現

最常見的原因就是基類的虛擬函式未實現了。由於C++類的實現可以分佈在多個原始檔中,所以生成目標檔案時,基類的虛擬函式沒有定義是不會報錯的。但是連結成可執行檔案時,需要將虛擬函式的資訊放進typeinfo中,這個時候虛擬函式未實現就會引發這個錯誤。

混用了no-RTTI程式碼和RTTI程式碼

難搞的就是這種情況。

如果混用了使用 -fno-rtti-frtti 編譯的程式碼後,當程式碼中寫了建立含有虛擬函式的類的物件、使用 dynamic_cast 等時就會發生這個錯誤

專案中我們自己寫的程式必須開啟RTTI,而我們使用的外部的一個庫使用no-RTTI編譯。我們在自己的程式碼中需要過載一個外部庫中的帶虛擬函式的類,結果連結的時候就出現了問題。外部庫中的基類使用 -fno-rtti 選項編譯,生成的程式碼沒有typeinfo資訊,而我們的程式碼使用 -frtti 選項編譯,要求基類必須要有typeinfo資訊。最後,我讓那個派生類所在的原始檔以-fno-rtti選項編譯,解決了問題。

相關文章