为了代码可以同时适应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展开后对函数的处理结果,因此一下子想不到这么多前因后果。

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

气死人不偿命,Q_OBJECT导致的C++报错,而且还看不明白(#ifdef没控制好,导致什么都不认识了)的更多相关文章

  1. Qt类声明中Q_OBJECT的作用与报错解决

    2017-06-22 周四 大雨 北京 院里 新建作图类,继承自QCUstomPlot类 因为需要同时作8张图,都要单坐标缩放的功能,因此想干脆新建一个类,继承自QCUstomPlot,把需要的功能都 ...

  2. Oracle数据库误删文件导致rman备份报错RMAN-06169解决办法

    Oracle数据库误删文件导致rman备份报错RMAN-06169解决办法 可能是误删文件导致在使用rman备份时候出现以下提示 RMAN-06169: could not read file hea ...

  3. SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错

    SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错 BP,试图创建一个新的vendor code, 角色是ZGM001, Grouping是G001, ...

  4. 分析https网页加载http资源导致的页面报错原因及其解决方案

    https网页加载http资源导致的页面报错及解决方案 https是当下的网站的主流趋势,甚至像苹果这样的大公司,则完全要求用户必须使用https地址. 然而对于以前http链接来说,我们往往就存在一 ...

  5. UseAdaptiveSizePolicy与CMS垃圾回收同时使用导致的JVM报错

    系统在灰度环境上变更时发现JVM启动报错,详细检查JVM配置参数,发现新境了如下配置: -XX:+UseAdaptiveSizePolicy和-XX:+UseConcMarkSweepGC 初步猜想是 ...

  6. oracle出现sga导致ORA-00821 ORA-00093报错解决办法

    本问题在linux环境下,windows环境下类似. 问题描述: 在数据库操作时不小心修改了share_pool的大小,导致重启数据库无法正常启动,报错为: SQL>startup; ORA-: ...

  7. [收藏转]由于CredSSP加密Oracle修正 导致远程桌面报错处理

    原文:https://blog.csdn.net/lanwilliam/article/details/80346792 由于win103月份的一个更新,导致mstsc突然无法连接服务器了,报错如标题 ...

  8. vs2015 安装之后安装MSSM 2016 导致 vs启动报错 System.ArgumentException 已添加了具有相同键的项,ActivityLog.xml

    如题,先是装了vs2015,开发什么的都没有问题,后来安装了SqlServer2016 MSSM,出大问题了,vs2015打开就报错,具体错误如上,还想还有个ActivityLog.xml 这个文件的 ...

  9. DB2 57016报错的解决办法(表状态不正常,导致表无法操作)

    新建了一张表,删除了一列,然后执行insert的时候,报错 57016,解释为:因为表不活动. 1.执行db2 "load query table <tabname>" ...

随机推荐

  1. CDN的原理及对SEO的影响

    http://www.williamlong.info/archives/4059.html CDN的概念最早于1995年由美国麻省理工大学提出,是一套能够实现用户就近访问的网络解决方案.具体方法是: ...

  2. php正则失效-最大回溯(pcre.backtrack_limit)/递归限制

    有时候,我们觉得,没有什么可以让我们快乐,我们甚至忘记了如何微笑.但是,当我们被一群乐观.欢乐的人包围的时候,他们从内心深处散发出来的欢迎一定会感染你. 这组照片中,你会看到真正的幸福和快乐的面孔,我 ...

  3. html-----020----事件

    html事件 <body> <a href="http://www.cctv.com" accesskey="k" target=" ...

  4. wiegand/韦根

    韦根 参考: 1.wiegand/韦根驱动

  5. springmvc学习(三)

    第一点---------使用 @RequestMapping 映射请求• Ant 风格资源地址支持 3 种匹配符:?:匹配文件名中的一个字符 *:匹配文件名中的任意字符 **:** 匹配多层路径 @R ...

  6. Build Error 6041: Internal build error

    Note: Following content is reprinted from the Original article Flexera : Build Error 6041. Only for ...

  7. MySql的安装与使用

    今天因为毕业设计要用到MySql数据库,所以就准备自己安装一个MySQL数据库,但是因为MySQL Install MSI只有32位,所以最后选择使用Windows (x86, 64-bit), ZI ...

  8. Nosql_笔记

    Nosql: http://www.infoq.com/cn/news/2011/01/nosql-why/ Redis: http://www.jb51.net/article/59294.htm ...

  9. linux 终端快捷键

    1. 移动光标快捷键 ctrl+f 向前移动一个字符 ctrl+b 向后移动一个字符 alt+f 向前移动一个单词 alt+b 向后移动一个单词 ctrl+a 移动到当前行首 ctrl+e 移动到当前 ...

  10. hibernate查询显示参数

    log4j.property改为如下 ### direct log messages to stdout ###          log4j.appender.stdout=org.apache.l ...