氣死人不償命,Q_OBJECT導致的C++報錯,而且還看不明白(#ifdef沒控制好,導致什么都不認識了)


為了代碼可以同時適應VC++和MingW編譯器,我改動了我的代碼,變成:

#ifdef _MSC_VER
#pragma comment(lib, "crypt32.lib") // Link OK,Linux 也要附帶這兩個庫,格式是 -lcrypt32 -lws2_32
#pragma comment(lib, "ws2_32.lib") // Link OK
//#pragma comment(lib, "dnsapi.lib") // 沒必要

#ifdef _DEBUG
#pragma comment(lib, "../libs/ChilkatDbg.lib") // Link OK
#else
#pragma comment(lib, "../libs/ChilkatRel.lib) // Link OK
#endif
#endif

然而不知道怎么回事,編譯不直接報錯,只是最后在鏈接的時候報錯:

“undefined reference to `vtable for myclass”

導致Q_OBJECT宏包含的幾個虛函數不認識。

網上都說是myclass.h沒有moc展開,重新運行qmake即可。當然別忘了刪除.user文件和Makefile文件,別忘了在工程里加入myclass.h文件。但是都試了,都不行。

此時我剛用QT Creator沒幾天,還以為自己QT Creator和MINGW不會用,所以工程參數沒設置好。沒辦法,卸載整個QT5,重裝,居然問題依舊。

----------------------------------------------------------------------------------

實在沒辦法了,只好回到VS2010做QT開發。沒想到同樣報錯,但是更詳細了,Moc展開過程中報錯:

my_tool.h(31): Note: No relevant classes found. No output generated.

最后的報錯:

1>my_class.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall MyClass::metaObject(void)const " (?metaObject@MyClass@@UBEPBUQMetaObject@@XZ)
1>my_class.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall MyClass::qt_metacast(char const *)" (?qt_metacast@MyClass@@UAEPAXPBD@Z)
1>my_class.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall MyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@MyClass@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
1>my_class.obj : error LNK2019: unresolved external symbol "public: void __thiscall MyClass::restoreProgress(unsigned __int64,unsigned __int64,class QString)" (?restoreProgress@MyClass@@QAEX_K0VQString@@@Z) referenced in function "public: bool __thiscall MyClass::DownloadFileList(class QStringList *,class QString,class QString,class QHash<class QString,class QString> &)" (?DownloadFileList@MyClass@@QAE_NPAVQStringList@@VQString@@1AAV?$QHash@VQString@@V1@@@@Z)

既然兩個編譯器和不同的IDE和環境變量都報錯,那么幾乎肯定是我自己的問題了。可是今天我沒怎么寫代碼,為什么會出錯呢?

聯想到網上說的Q_OBJECT的問題,估計是之前改動#ifdef 宏定義條件,導致出問題。找出舊版本的宏定義換上,果然就沒問題了。

看來是因為C++編譯器對我寫的宏定義條件不認識(或判斷錯誤)導致Q_OBJECT展開后(或者無法展開),導致無法正常編譯。

然而C++編譯器卻是報錯Q_OBJECT展開后對函數的處理結果,因此一下子想不到這么多前因后果。

浪費了好幾個小時,氣死我了,但總是明白了,順手記下。


免責聲明!

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



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