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