Undefined Reference to Typeinfo
轉載自:http://richardustc.github.io/blog/2013/07/undefined-reference-to-typeinfo/
在項目中遇到了這樣一個問題:C++文件編譯都OK,但鏈接的時候報錯:undefined reference to `typeinfo for xxx’。typeinfo是C++中的RTTI(RunTime Type Identification)機制中記錄類型信息用的,dynamic_cast和typeid操作符會使用這些信息。
以”undefined reference to typeinfo”為關鍵字在網絡上搜索,大多數都是說有虛函數定義了但是未實現導致的。但是我的代碼顯然不是這個情況。在我即將放棄的時候,終于在StackOverflow上發現有人提出,這種錯誤的原因也可能是混合使用了帶RTTI信息和不帶RTTI信息的代碼導致的。對比檢查,發現我的項目里的問題正是這個。最后用了一點dirty hack,解決了bug。下面就仔細分析一下”undefined reference to `typeinfo for xxx’“產生的原因。
虛函數未實現
產生”undefined reference to `typeinfo for xxx’“最常見的原因就是基類的虛函數未實現了。由于C++類的實現可以分布在多個源文件中,所以生成目標文件時,基類的虛函數沒有定義是不會報錯的。但是鏈接成可執行文件時,需要將虛函數的信息放進typeinfo中,這個時候虛函數未實現就會引發這個錯誤。
混用了no-RTTI代碼和RTTI代碼
我碰到的正是混用了no-RTTI和RTTI代碼的情形。項目中我們自己寫的程序必須開啟RTTI,而我們使用的外部的一個庫使用no-RTTI編譯。我們在自己的代碼中需要重載一個外部庫中的帶虛函數的類,結果鏈接的時候就出現了問題。外部庫中的基類使用-fno-rtti選項編譯,生成的代碼沒有typeinfo信息,而我們的代碼使用-frtti選項編譯,要求基類必須要有typeinfo信息。最后,我在編譯系統中做了一些dirty hack,讓那個派生類所在的源文件以-fno-rtti選項編譯,解決了問題。
----------------------------------------------------------------
我遇到的問題類似,現在的項目中需要開啟RTTI,鏈接的外部庫是no-RTTI編譯的,在現在的工程中重載外部庫的帶虛函數的類,連接的時候報錯.原文說的dirty hack,是對單個文件加編譯選項-fno-rtti 。因為我用的外部庫是可以開啟RTTI的,我用RTTI重新編譯一次后,現在的工程不報錯啦。
總結
以上是生活随笔為你收集整理的Undefined Reference to Typeinfo的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssh 远程登录不用密码 ssh-key
- 下一篇: warning: control rea