2018年10月5日 星期五

【學習】Qt 學習筆記:Q_OBJECT 的 LNK2001 錯誤

為了實作 Qt 內的 signal 與 slot 關係,必須將使用的類別繼承 QObject, 並同時於類別加入 Qt 自訂巨集,Q_OBJECT。 於是乎,編譯錯誤滿滿地跳出,

LNK2001 unresolved external symbol "public: virtual struct QMetaObject const * __thiscall myClass::metaObject(void)const " (metaObject@myClass@@UBEPBUQMetaObject@@XZ)
LNK2001 unresolved external symbol "public: virtual void * __thiscall myClass::qt_metacast(char const *)" (qt_metacast@myClass@@UAEPAXPBD@Z)
LNK2001 unresolved external symbol "public: virtual int __thiscall myClass::qt_metacall(enum QMetaObject::Call,int,void * *)" (qt_metacall@myClass@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
LNK1120 3 unresolved externals



開發環境為 VS2015,建構 Qt Project 的方式為手動執行,而非透過 Qt VS Tools 進行設定,因此這些錯誤訊息在透過 Qt VS Tools 所建構的專案並不會發生。

問題的原因主要是使用到 Q_OBJECT 的 header 檔沒有成功生成對應的 moc 檔案,因此解決方法可以根據下面的圖示解決:

1. 在使用到的檔案點選滑鼠右鍵進入屬性,這時候可以看到在 Item Type 那邊為 "C/C++ header"。


2. 將 "C/C++ header" 修改成 "Customer Build Tool"。


3. 點選左側 "Customer Build Tool" 頁面,剛更改的時候可能會沒有內容,可以先關閉屬性頁面,再重新開啟即會出現。主要在 "Command Line", "Outputs", 以及 "Additional Dependencies" 加入方法,分別為:

Command Line
"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" 

Outputs
.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp

Additional Dependencies
$(QTDIR)\bin\moc.exe;%(FullPath)


4. 將生成好的 moc 檔案拉進 solution 內。

如此應該可以解決這樣的 LINK error。


沒有留言:

張貼留言

熱門文章