1. 程式人生 > >Qt 出現“undefined reference to `vtable for”

Qt 出現“undefined reference to `vtable for”

在QT中定義了一個執行緒類,繼承自QThread, 在類中未加 Q_OBJECT 時編譯正常,加入後報錯如下:

undefined reference to `vtable for myThread'

在串列埠下,手動make,無錯誤。

百度後得知:

一:預編譯器開啟巨集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裡面去,才能解決這個問題.

 

解決方法:

修改makefile中相關檔案。