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

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

  • 相关阅读:
    Akka 报错:java.net.BindException: [/?.?.?.?:25520] Address already in use: bind
    Akka 远程通信报错:ActorSelection[Anchor(akka://client/deadLetters), Path(/user/YellowChickenServer)]
    Akka启动报错:Exception in thread "main" java.lang.ClassNotFoundException: akka.remote.RemoteActorRefProvider
    IDEA 控制台输出乱码
    Akka启动时,报错:java.lang.NoClassDefFoundError: scala/Product$class
    java并发编程实践线程安全性
    在Linux创建开机自启动服务
    关联规则Apriori算法和FPTree
    git的安装及简单使用
    linux防止暴力破解
  • 原文地址:https://www.cnblogs.com/findumars/p/4467861.html
Copyright © 2020-2023  润新知