1. 程式人生 > >error LNK2001: 無法解析的外部符號 Qt的moc機制

error LNK2001: 無法解析的外部符號 Qt的moc機制

先轉一下其他人的帖,同樣是error LNK2001的問題。

第一次來發個帖,如果可能的話期望找到根本原因!

幾天沒有關注我的QT程式,再次拿出來編譯後竟然出現連線錯誤,因為四體不勤,沒有頻繁的checkin,所以無法找到中間版本,只能解決問題了。

1>MainWindowBottomWidget.obj : error LNK2001: 無法解析的外部符號 "public: virtual struct QMetaObject const * __thiscall

MainWindowBottomWidget::metaObject(void)const " ()
1>MainWindowBottomWidget.obj : error LNK2001: 無法解析的外部符號 "public: virtual void * __thiscall MainWindowBottomWidget::qt_metacast

(char const *)" ()
1>MainWindowBottomWidget.obj : error LNK2001: 無法解析的外部符號 "public: virtual int __thiscall MainWindowBottomWidget::qt_metacall(enum

QMetaObject::Call,int,void * *)" ()

問題原因:沒有找到根本原因,據說是連結時無法找到對應的moc檔案。
VS2008問題解決方法:在對應的cpp檔案的末尾加上#include "moc_MainWindowBottomWidget.cpp"(檔名根據實際情況修改)
 


原因:
1. 是否加上了Q_OBJECT巨集?
2. 你的widget裡用到signal slot了吧?(也許是後續加的)
3. 類定義在cpp裡了? 沒有相應的.h檔案?
4. 如果以前沒訊號槽新加的, 那麼makefile需要重新生成。

如果用到訊號槽但類的定義沒有放在.h檔案中, qmake不會自動調moc, 你就需要寫#include "moc_MainWindowBottomWidget.cpp"告訴qmake你有檔案需要moc

在visual studio中,如果是接下來新增的Q_OBJECT巨集、訊號函式、槽函式等,由於之前編譯過程中沒有生成moc檔案,或者該moc檔案已被刪除,那麼新新增後,visual studio就不會再生成moc檔案了,這就導致visual studio在連結時出現以上情況的Error。

我總結的原因如下:

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的錯誤。

修改方法:

如果在.cpp檔案的末尾新增#include "moc_MainWindowBottomWidget.cpp",確實可以解決error LNK2001的問題。但是,總有一種讓人很不爽的感覺。我用以下的方法解決了這個問題:
1. 複製一份.h、.cpp檔案並備份起來;
2. 在vs工區中移除並刪除對應檔案;
3. 新建兩個空白檔案,命名為*.h、*.cpp,再重新載入這兩個檔案至工程中;
4. 將備份中的.h、.cpp檔案中的內容複製到新新增的*.h、*.cpp檔案裡;
5. 重新編譯。