2010-07-16 132 views
11

我在構建應用程序時收到以下鏈接器錯誤。Q_OBJECT鏈接器錯誤!

HIMyClass.obj:: error: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall CHIMyClass::metaObject(void)const " ([email protected]@@[email protected]@XZ) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual void * __thiscall CHIMyClass::qt_metacast(char const *)" ([email protected]@@[email protected]) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual int __thiscall CHIMyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected]@@[email protected]@@[email protected]) File not found : HIMyClass.obj

我的類的聲明就像

class CHIMyClass:public QDialog 
{ 
    Q_OBJECT 

    .... 

}; 

當我評論Q_OBJECT鏈接錯誤熄滅(,顯然我不能夠使用信號和槽)。我使用Qt Creator作爲IDE和Qt 4.5.3。當我給重建全部確定QMake將被調用。我想,它的moc_ *文件的代是問題所在。我使用Windows XP和CL作爲編譯器。

鏈接器錯誤背後的原因是什麼?

+0

也許'找不到文件:HIMyClass.obj'告訴我們,Qt Creator沒有看到moc/obj/temp文件? – mosg 2010-07-16 11:39:47

+1

真的,重新運行qmake。另外,請檢查.pro文件中是否缺少或多餘的「\」字符。 – andref 2010-07-16 17:22:13

回答

27

此類錯誤通常意味着您沒有將類的標題添加到pro文件中的「HEADERS」變量(元對象編譯器僅爲此變量中列出的標題生成moc_文件)。記住在更改.pro文件後運行qmake!

+0

相應的頭文件已經在HEADERS變量下仍然可用,但仍然面臨着這個問題..這不是原因..至少在我的情況下.. :( – liaK 2010-07-16 13:31:37

+2

手動刪除所有由qmake和所有目標文件生成的文件,然後重新運行qmake。 – chalup 2010-07-16 18:02:07

+1

@ chalup,我刪除了所有MOC,OBJ,RCC文件並運行qmake,現在它工作正常。雖然很高興它的工作,這是瘋了..爲什麼這樣一個未定義的行爲??任何猜測?? – liaK 2010-07-19 05:00:30

0

檢查必要的Qt的配置選項都存在於親文件(QT += core gui至少,也嘗試手動刪除所有內置/ build目錄創建的。它有時會發生moc不能出於某種原因運行。

您也可以嘗試自己運行MOC命令,看看它輸出(你可以找到在該選項卡中QtCreator「編譯輸出」的命令行

更新:this相關問題似乎在暗示你不在編譯時定義QT_DLL。你可以嘗試一個新的和新的簡單的QtCreator項目(例如用一個小窗口來展示mainwindow子類)並嘗試。它應該自動包含Q_OBJECT頭並嘗試比較.pro文件和編譯器輸出。

+0

這不是Qt符號的缺失,而是他自己班級的moc生成的符號。所以我寧願和chalup一起去查看頭文件中列出的頭文件。一個完全乾淨的版本可能也有幫助。 – 2010-07-16 12:57:35

+0

它鏈接罰款所有其他類具有Q_OBJECT宏。@Frank,我把這個文件包含在HEADERS部分中,並嘗試了多次乾淨的構建..雖然沒有運氣.. :( – liaK 2010-07-16 13:29:56

1

檢入文件MakeFile.debug也許HIMyClass不存在。

我剛剛重命名爲MakeFile.debug,清理項目和重建所有,它編譯。

12

我有一個類似的問題,它使用andref的反饋來解決。在Qt Creator的我乾脆:

  1. 編譯/清潔所有
  2. 編譯/運行qmake的
  3. 編譯/運行
+0

這個給我修好了 – ThePosey 2011-08-16 15:20:39

+0

qmake是關鍵注意事項;) – 2015-10-16 10:18:29

1

我有同樣的問題,但對我來說這是不夠的清潔 - >構建。所以我不得不手動刪除在構建過程中創建的所有文件(Mekefiles,cpp中的ui描述,以及通常由構建過程創建的整個目錄),然後才能構建成功。

0

我的osx盒上這是由於缺少moc *文件。 我通過從我的utf-8編碼的.pro文件中刪除了bom來解決這個問題。 我將用qt提交一個bug。

用於護目鏡搜索的錯誤... 注意:缺少的vtable通常意味着第一個非內聯虛擬成員函數沒有定義。

"vtable for MainWindow", referenced from:

MainWindow::MainWindow(QWidget*)in mainwindow.o 
1

因爲寫這篇文章,我已經修訂

我發現我需要重建前必須摸摸.pro文件,即

  1. 添加隨機字符
  2. 保存
  3. 刪除隨機字符
  4. 保存
  5. 構建項目

步驟1 - 4似乎使任何舊的moc *文件失效,迫使qmake重建它們。 否則,重建項目似乎使用陳舊的moc *文件。

[編輯]已更新的回答。

由於寫這篇文章,我幾乎一直是clean,qmake然後buildqmake非常重要,因爲它會再現您需要的moc *文件,如果您要更改.h文件並根據Q_OBJECT更改繼承。事實上,在某些情況下,您甚至可以簡單地爲qmake然後build進行增量構建。

0

我發現了另一個可能的原因和解決這個錯誤

如果一個已經宣佈的.h文件中的插槽中,但不是在

0

我有這個問題的實現定義它的身體也會出現此錯誤。 驗證是否存在對.cpp文件中插槽實現的描述。

0

我已經從我的主文件中刪除#include "main.moc",並忘記重新添加它......這是一個有趣的時間浪費!

0

來自@chalup和@ierax的答案幫了我。爲了讓qmake生效,我不得不關閉Qt創建器並再次打開它。我遵循以下步驟: 1.將類定義移動到頭文件。 2.添加頭文件到項目中,並確保它在.pro文件中與HEADERS + = \列表中列出。 3.全部清理 4.關閉QtCreator(在Windows 10上) 5.從項目目錄刪除Makefiles 6.打開QtCreator並打開項目。 7. Qmake確保生成文件生成。 8.重建全部

這些步驟幫助我解決了這個問題 - 我掙扎了一個多小時,其他各種答案和方法都沒有奏效。在運行qmake之前,請確保您刪除makefile並關閉QtCreator(適用於Windows 10的至少)。