QT中的 undefined reference to vtable for "xxx::xxx" 錯誤解決

QT應用程序在link的時候提示undefined reference to vtable for "xxx::xxx",第一次遇到這個錯誤的時候還以爲是虛函數使用出的問題,當然如果虛函數使用不當,比如在某個實現類中只有聲明沒有定義,也會報類似的錯誤。

實際上QT中的這種錯誤很可能是由於在該類中使用了Q_OBJECT宏的緣故,當把出錯的類中的Q_OBJECT註釋掉,編譯鏈接如果不報任何錯誤,恭喜,你絕對錯在了Q_OBJECT上。關於這個錯誤的說明網上可以搜到一堆,是和moc文件相關的,牽涉到QT的實現機制,不去細究,只說一下其解決方法:

如果是一般的QT工程(指的是用QT-designer新建的工程,或者用KDevelop新建的qmake工程),這類工程的特徵是主目錄下會有個工程文件:project-name.pro(kdevelop的qmake工程的project-name.pro); 這種工程只要重新qmake一下就可以解決問題,即移除所有編譯出來的.o文件,然後由工程文件重新生成Makefile,這樣qmake會把關於moc的一些選項加入Makefile,接着重新編譯即可。

如果是KDevelop中建的其他工程如KDE工程,這樣的工程下並沒有QT的工程文件,那怎麼辦呢?不用緊張,工程目錄下應該有個/debug/src目錄,切換到該目錄,裏面是不是有一些已經編譯出來的.o文件,甚至還有class-name.moc.cpp這樣的文件。接下來要做的就是把這些文件統統刪除,然後在kdevelop中重新編譯整個工程,然後就等着吧,kdevelop會重新運行automake工具重新配置./configure,然後重新生成Makefile,然後就是編譯、連接通過,是不是很簡單呢?當初可花了我不少時間,。。。

總結,這個“Undefined reference to vtable for ***”問題的原因在於生成moc文件,並在編譯的時候將其包含進對應的類中,不過並不需要我們手工去編譯生成moc文件,或者手工修改Makefile。希望這些文字可以對您有哪怕很小一點的幫助!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章