轉自:http://www.cnblogs.com/qianyuming/archive/2011/03/09/1978910.html

在Qt中,undefined reference to ‘vtable for 通常出現在打開了宏 Q_OBJECT的程式當中。我遇到的情況是:

將類體及類體實現直接寫到main.cpp里,沒有包含 moc文件。這是一種常見的C++錯誤,通常就是類體中聲明的虛函數沒有找到實體。有時候你會說,我沒有聲明虛函數啊,怎么出來的? 那么建議你 Ctrl+左鍵追蹤一下Q_OBJECT這個宏,這個宏其實默認給你的類加入了一些虛函數的聲明(關于signal-slot實現的關鍵設施),而其實現實在moc_xx.cpp中自動生成的,如果你的編譯過程沒有產生這個文件,或者產生的這個文件沒有參與到編譯鏈接中去,那么就會發生這個錯誤。

現將一篇文章收錄于此,以備查閱:

undefined reference to ‘vtable for 常見情況:

一:預編譯器打開宏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文件,之后連接就出問題?! ∥艺伊撕枚嘣创a之類的問題,就是沒有找pro的錯誤,后來想到qt中moc我們是有make做的  qt的make編譯是根據Makefile來的,而Makefile是由pro文件來的。這才想到了找pro文件的錯誤?! ?/span>

二: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里面去,才能解決這個問題.  

3. 看Qt的reference發現: 可以connect(pObjA, SIGNAL(someSignalA()),pObjB,SIGNAL(someSignalB()));這樣pObjA發出的someSingalA 會導致pObjB發出someSignalB,從而形成信號接力.