zoukankan      html  css  js  c++  java
  • 气死人不偿命,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展开后对函数的处理结果,因此一下子想不到这么多前因后果。

    浪费了好几个小时,气死我了,但总是明白了,顺手记下。

  • 相关阅读:
    TinyMCE 复制word里面带图文的文章,图片可以直接显示
    xhEditor 复制word里面带图文的文章,图片可以直接显示
    KindEditor 复制word里面带图文的文章,图片可以直接显示
    FCKEditor 复制word里面带图文的文章,图片可以直接显示
    CKEditor 复制word里面带图文的文章,图片可以直接显示
    百度编辑器 复制word里面带图文的文章,图片可以直接显示
    Flowable 数据库表结构说明、Flowable 数据字典说明
    在阿里淘系6个月能有哪些收获和成长?
    异地多活之企业架构案例
    java第七次作业
  • 原文地址:https://www.cnblogs.com/findumars/p/4467861.html
Copyright © 2011-2022 走看看