Qt中,undefined reference to ‘vtable for 一般出如今打開了宏 Q_OBJECT的程式當中。我遇到的狀況是:函數
將類體及類體實現直接寫到main.cpp裏,沒 有包含 moc文件。這是一種常見的C++錯誤,一般就是類體中聲明的虛函數沒有找到實體。有時候你會說,我沒有聲明虛函數啊,怎麼出來的? 那麼建議你 Ctrl+左鍵追蹤一下Q_OBJECT這個宏,這個宏其實默認給你的類加入了一些虛函數的聲明(關於signal-slot實現的關鍵設施),而其實現 實在moc_xx.cpp中自動生成的,若是你的編譯過程沒有產生這個文件,或者產生的這個文件沒有參與到編譯連接中去,那麼就會發生這個錯誤。ui
現將一篇文章收錄於此,以備查閱:spa
undefined reference to ‘vtable for 常見狀況:get
一:預編譯器打開宏Q_OBJECT,聲明若干個 由moc處理(implement)的成員函數。若是獲得相似於「undefined reference to vtable for LcdNumber」的編譯錯誤(if you get compiler errors along the lines of "undefined reference to vtable for LcdNumber"),你多是忘記了執行moc,或者忘記了將moc輸出加入到link命令裏。 某一個類中若是加入Q_OBJECT後,則 link時提示:undefined reference to vtable for "xxx::xxx".刪掉它則沒有任何問題. 解決:嘗試(1):把全部的obj文件和uic文件刪除,從新編譯.仍然失敗. 去 trolltech的mail lists找到緣由: 由於qmake生成Makefile的時候,這個類的頭文件中並無Q_OBJECT,因此在相應的Makefile裏面並無用moc xxx.h命令,最終致使連接失敗.從新運行qmake,問題解決. 在查找解決方法的時候,附帶發現一點:
qmake 不會處理.cpp文件裏的Q_OBJECT,因此,若是在.cpp文件中有它的話,也會產生undefined reference to vtable for "xxx::xxx". 這時,須要先用moc xxxx.cpp生成相應的moc文件,再包含到.cpp裏面去,才能解決這個問題. 這裏能夠發現問題的出現是由於沒有moc生成相應的moc文件, 以後鏈接就出問題。 我找了好多源碼之類的問題,就是沒有找pro的錯誤,後來想到qt中moc咱們是有make作的 qt的make編譯是根據 Makefile來的,而Makefile是由pro文件來的。這纔想到了找pro文件的錯誤。 編譯器
二:undefined reference to vtable for "xxx::xxx" 今天碰到了這個問題。 緣由:qmake不會處理.cpp文件裏的Q_OBJECT,因此,若是在.cpp文件中有它的話,也 會產生undefined reference to vtable for "xxx::xxx". 這時,須要先用moc xxxx.cpp生成相應的moc文件,再包含到.cpp裏面去,才能解決這個問題. 其餘:
1.問題: QGLViewer中的函數不能正常link.解決: 翻看其源代碼,發現是由於從源碼安裝libQGLViewer時,編譯用了Qt 3,而個人程序中用Qt4 編譯.因此必須從新用Qt4編譯.可是,更改QTDIR 環境變量爲Qt4後,從新編譯的話,qmake生成makefile時就提示出錯.進一步發現,是由於雖然設了QTDIR爲Qt4,頭文件和庫文件都會使 用Qt4,可是moc,uic等都是用的qt3版的,再把PATH環境變量改動後,一切ok. 源碼
2.問題:某一個類中若是加入Q_OBJECT 後, 則link時提示:undefined reference to vtable for "xxx::xxx".刪掉它則沒有任何問題.解決:嘗試(1):把全部的obj文件和uic文件刪除,從新編譯.仍然失敗.去trolltech的 mail lists找到緣由: 由於qmake生成Makefile的時候,這個類的頭文件中並無Q_OBJECT,因此在相應的Makefile裏面並無用moc xxx.h命令,最終致使連接失敗.從新運行qmake,問題解決.在查找解決方法的時候,附帶發現一點:qmake 不會處理.cpp文件裏的Q_OBJECT,因此,若是在.cpp文件中有它的話,也會產生undefined reference to vtable for "xxx::xxx". 這時,須要先用moc xxxx.cpp生成相應的moc文件,再包含到.cpp裏面去,才能解決這個問題. qt
3. 看Qt的reference發現: 能夠connect(pObjA, SIGNAL(someSignalA()),pObjB,SIGNAL(someSignalB()));這樣pObjA發出的someSingalA 會致使pObjB發出someSignalB,從而造成信號接力.編譯