因爲Qt自己實現的機制所限,咱們在使用Qt製做某些軟件程式的時候,會碰到各類各樣這樣那樣的問題,並且不少是很難,或根本很難找到緣由的,即便解決了問題,假若有人問您爲何,您只能回答--不知道;
今天我在這裏列舉的問題也是再編寫Qt程式時,老是碰到的問題,問題廣泛,而答案卻不惟一,解釋這一個問題的說法不少,每每只適合某一種狀況,由於這個錯誤太籠統了,他就是-- 「undefined reference to `vtable for」可能您看着很熟悉,彷佛在c++程式中也碰到過這個問題,您說對了,有時候這個錯誤,不僅是qt的緣由,更有您的c++程式的緣由;
下面蒐集了網上的一些出現的現象,對應解決方法,緣由,基本上我都驗證過,收錄於此,以作備份;
一:
預編譯器打開宏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文檔的錯誤。
from: http://www.cublog.cn/u/16292/showart_136087.html
二:
undefined reference to vtable for "xxx::xxx"
今天碰到了這個問題,終於被我google到了:
http://www.cublog.cn/opera/showart.php?blogid=8650&id=49526
原 因: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,從而造成信號接力. php