Qt中关于undefined reference to `vtable for故障总结
在Qt中,undefined reference to ‘vtable for 通常出現(xiàn)在打開了宏 Q_OBJECT的程式當(dāng)中。我遇到的情況是:
將類體及類體實(shí)現(xiàn)直接寫到main.cpp里,沒有包含 moc文件。這是一種常見的C++錯(cuò)誤,通常就是類體中聲明的虛函數(shù)沒有找到實(shí)體。有時(shí)候你會(huì)說,我沒有聲明虛函數(shù)啊,怎么出來的? 那么建議你 Ctrl+左鍵追蹤一下Q_OBJECT這個(gè)宏,這個(gè)宏其實(shí)默認(rèn)給你的類加入了一些虛函數(shù)的聲明(關(guān)于signal-slot實(shí)現(xiàn)的關(guān)鍵設(shè)施),而其實(shí)現(xiàn)實(shí)在moc_xx.cpp中自動(dòng)生成的,如果你的編譯過程沒有產(chǎn)生這個(gè)文件,或者產(chǎn)生的這個(gè)文件沒有參與到編譯鏈接中去,那么就會(huì)發(fā)生這個(gè)錯(cuò)誤。
現(xiàn)將一篇文章收錄于此,以備查閱:
undefined reference to ‘vtable for 常見情況:
一:預(yù)編譯器打開宏Q_OBJECT,聲明若干個(gè)由moc處理(implement)的成員函數(shù)。如果得到類似于“undefined reference to vtable for LcdNumber”的編譯錯(cuò)誤(if you get compiler errors along the lines of "undefined reference to vtable for LcdNumber"),你可能是忘記了執(zhí)行moc,或者忘記了將moc輸出加入到link命令里。 某一個(gè)類中如果加入Q_OBJECT后,則link時(shí)提示:undefined reference to vtable for "xxx::xxx".刪掉它則沒有任何問題. 解決:嘗試(1):把所有的obj文件和uic文件刪除,重新編譯.仍然失敗. 去trolltech的mail lists找到原因: 因?yàn)閝make生成Makefile的時(shí)候,這個(gè)類的頭文件中并沒有Q_OBJECT,所以在相應(yīng)的Makefile里面并沒有用moc xxx.h命令,最終導(dǎo)致鏈接失敗.重新運(yùn)行qmake,問題解決. 在查找解決方法的時(shí)候,附帶發(fā)現(xiàn)一點(diǎn):
qmake 不會(huì)處理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有它的話,也會(huì)產(chǎn)生undefined reference to vtable for "xxx::xxx". 這時(shí),需要先用moc xxxx.cpp生成相應(yīng)的moc文件,再包含到.cpp里面去,才能解決這個(gè)問題. 這里可以發(fā)現(xiàn)問題的出現(xiàn)是因?yàn)闆]有moc生成相應(yīng)的moc文件,之后連接就出問題。 我找了好多源碼之類的問題,就是沒有找pro的錯(cuò)誤,后來想到qt中moc我們是有make做的 qt的make編譯是根據(jù)Makefile來的,而Makefile是由pro文件來的。這才想到了找pro文件的錯(cuò)誤。
二:undefined reference to vtable for "xxx::xxx" 今天碰到了這個(gè)問題。 原因:qmake不會(huì)處理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有它的話,也會(huì)產(chǎn)生undefined reference to vtable for "xxx::xxx". 這時(shí),需要先用moc xxxx.cpp生成相應(yīng)的moc文件,再包含到.cpp里面去,才能解決這個(gè)問題. 其他:
1.問題: QGLViewer中的函數(shù)不能正常link.解決: 翻看其源代碼,發(fā)現(xiàn)是因?yàn)閺脑创a安裝libQGLViewer時(shí),編譯用了Qt 3,而我的程序中用Qt4 編譯.所以必須重新用Qt4編譯.但是,更改QTDIR 環(huán)境變量為Qt4后,重新編譯的話,qmake生成makefile時(shí)就提示出錯(cuò).進(jìn)一步發(fā)現(xiàn),是因?yàn)殡m然設(shè)了QTDIR為Qt4,頭文件和庫文件都會(huì)使 用Qt4,但是moc,uic等都是用的qt3版的,再把PATH環(huán)境變量改動(dòng)后,一切ok.
2.問題:某一個(gè)類中如果加入Q_OBJECT后, 則link時(shí)提示:undefined reference to vtable for "xxx::xxx".刪掉它則沒有任何問題.解決:嘗試(1):把所有的obj文件和uic文件刪除,重新編譯.仍然失敗.去trolltech的 mail lists找到原因: 因?yàn)閝make生成Makefile的時(shí)候,這個(gè)類的頭文件中并沒有Q_OBJECT,所以在相應(yīng)的Makefile里面并沒有用moc xxx.h命令,最終導(dǎo)致鏈接失敗.重新運(yùn)行qmake,問題解決.在查找解決方法的時(shí)候,附帶發(fā)現(xiàn)一點(diǎn):qmake 不會(huì)處理.cpp文件里的Q_OBJECT,所以,如果在.cpp文件中有它的話,也會(huì)產(chǎn)生undefined reference to vtable for "xxx::xxx". 這時(shí),需要先用moc xxxx.cpp生成相應(yīng)的moc文件,再包含到.cpp里面去,才能解決這個(gè)問題.
3. 看Qt的reference發(fā)現(xiàn): 可以connect(pObjA, SIGNAL(someSignalA()),pObjB,SIGNAL(someSignalB()));這樣pObjA發(fā)出的someSingalA 會(huì)導(dǎo)致pObjB發(fā)出someSignalB,從而形成信號接力.
轉(zhuǎn)載于:https://www.cnblogs.com/qianyuming/archive/2011/03/09/1978910.html
總結(jié)
以上是生活随笔為你收集整理的Qt中关于undefined reference to `vtable for故障总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地址栏射击游戏!对,你没看错,就是在地址
- 下一篇: 显示内容长时,显示部分内容,鼠标移入显示