QT + VS2005 編譯出現 error LNK2001: 無法解析的外部符號 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject 錯誤


在使用QT + VS2005編譯程序時,有時出現如下錯誤:
錯誤 1 error LNK2001: 無法解析的外部符號 "public: virtual struct QMetaObject const * __thiscall Widget::metaObject(void)const " (?metaObject@Widget@@UBEPBUQMetaObject@@XZ)
錯誤 2 error LNK2001: 無法解析的外部符號 "public: virtual void * __thiscall Widget::qt_metacast(char const *)" (?qt_metacast@Widget@@UAEPAXPBD@Z)
錯誤 3 error LNK2001: 無法解析的外部符號 "public: virtual int __thiscall Widget::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Widget@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
錯誤 4 fatal error LNK1120: 3 個無法解析的外部命令

查找原因:
1. 是否加上了Q_OBJECT宏?
2. 你的widget里用到signal slot了吧?(也許是后續加的)
3. 類定義在cpp里了? 沒有相應的.h文件?
4. 如果以前沒信號槽新加的, 那么makefile需要重新生成。

總結的原因如下:
vs在編譯時會產生一系列的命令以控制該.h、.cpp文件的編譯過程,並且,以后不會自動修改這些命令。
利用Qt編程時,寫好.h、.cpp文件並第一次編譯之后,若.h文件中定義類時沒有添加Q_OBJECT宏以及信號函數、槽函數,VS編譯命令中就沒有moc命令,就不會調用Qt的moc工具以生成moc_*.cpp文件;並且即使添加了Q_OBJECT宏之后,VS也不會自動添加moc命令,因而不會生成moc文件。
VS在LINK時,找不到moc文件,就出現了error LNK2001的錯誤。

解決方法:假設代碼文件分別為hello.h、hello.cpp、ui_hello.h。需要編譯生成並添加上moc_hello.cpp文件。
  右擊hello.h,選擇“自定義生成步驟”,“常規”
  命令行:moc.exe hello.h -o moc_hello.cpp
  輸出:moc_hello.cpp
  附加依賴項:moc.exe hello.h
  確定,然后,右擊hello.h,選擇 “編譯”,則在文件夾中生成moc_hello.cpp,再將其添加到源文件中。
然后運行程序,如果出現錯誤:
  錯誤 fatal error C1010: 在查找預編譯頭時遇到意外的文件結尾。是否忘記了向源中添加“#include "stdafx.h"”?
  則在moc_hello.cpp文件的開頭添加上:#include "stdafx.h"。
然后,再運行。仍然出現上面錯誤。這是因為當運行程序,又重新生成了moc_hello.cpp文件(這個新的文件的開頭顯然是沒有#include "stdafx.h"),覆蓋了已經修改過的文件。
  解決方法:右擊hello.h,選擇“自定義生成步驟”,“常規”
  清空“命令行” “輸出” “附加依賴項” 里對應的內容。這樣在運行程序時就不會再生成新的moc_hello.cpp文件了。然后確定。
  這樣再次運行程序,可以成功運行。

對於上述的第二個錯誤可以直接在項目屬性--》C/C++--》預編譯頭--》創建/使用預編譯頭改為不使用預編譯頭。就可以一勞永逸了,不用上述這么麻煩的方法了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM