为了代码可以同时适应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. 【转】JavaScript系列文章:自动类型转换

    我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期 ...

  2. .net 中连接mysql

    1. 下载mysql驱动.里面包含需要连接mysql的dll.mysql-connector-net    地址:http://dev.mysql.com/downloads/file/?id=463 ...

  3. SQLserver数据库基础

    1·控制数据库的服务 运行 cmd 在控制面板输入  net  start   MSSQLserver   (启动数据库服务) 在控制面板输入  net  stop   MSSQLserver   ( ...

  4. Git和CocoaPods的简单使用

    Git是一款免费.开源的分布式版本控制系统,还有一种SVN的开源的集中式版本控制系统.分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一 ...

  5. spring mvc 多视图配置

    <!-- jsp视图解析器--> <bean id="viewResolver" class="org.springframework.web.serv ...

  6. LevelDb原理剖析

    在说LevelDb之前,先认识两位大牛,Jeff Dean和Sanjay Ghemawat,这两位是Google公司重量级的工程师,为数甚少的Google Fellow之二. Jeff Dean其人: ...

  7. Android开发系列之学习路线图

    通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明 ...

  8. 整理grep实战文本搜索过滤技巧

    一:grep的简介: 文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能够被模式所匹配到的行.配合正则表达式的使用可以实现强大的文本处理.下面一一说明正则的例子. 二:文本处理工具分类 ...

  9. 为WPF版的GridControl控件添加行序号功能

    废话不多数,先上效果图和代码: 包装GridControl控件 cs using DevExpress.Xpf.Data; using DevExpress.Xpf.Grid; using Syste ...

  10. hdu 2767 Proving Equivalences

    Proving Equivalences 题意:输入一个有向图(强连通图就是定义在有向图上的),有n(1 ≤ n ≤ 20000)个节点和m(0 ≤ m ≤ 50000)条有向边:问添加几条边可使图变 ...