气死人不偿命,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展开后对函数的处理结果,因此一下子想不到这么多前因后果。
浪费了好几个小时,气死我了,但总是明白了,顺手记下。
气死人不偿命,Q_OBJECT导致的C++报错,而且还看不明白(#ifdef没控制好,导致什么都不认识了)的更多相关文章
- Qt类声明中Q_OBJECT的作用与报错解决
2017-06-22 周四 大雨 北京 院里 新建作图类,继承自QCUstomPlot类 因为需要同时作8张图,都要单坐标缩放的功能,因此想干脆新建一个类,继承自QCUstomPlot,把需要的功能都 ...
- Oracle数据库误删文件导致rman备份报错RMAN-06169解决办法
Oracle数据库误删文件导致rman备份报错RMAN-06169解决办法 可能是误删文件导致在使用rman备份时候出现以下提示 RMAN-06169: could not read file hea ...
- SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错
SAP S4HANA 账户组的配置里'Int.Std.Grping'选项没勾选导致ABAP程序报错 BP,试图创建一个新的vendor code, 角色是ZGM001, Grouping是G001, ...
- 分析https网页加载http资源导致的页面报错原因及其解决方案
https网页加载http资源导致的页面报错及解决方案 https是当下的网站的主流趋势,甚至像苹果这样的大公司,则完全要求用户必须使用https地址. 然而对于以前http链接来说,我们往往就存在一 ...
- UseAdaptiveSizePolicy与CMS垃圾回收同时使用导致的JVM报错
系统在灰度环境上变更时发现JVM启动报错,详细检查JVM配置参数,发现新境了如下配置: -XX:+UseAdaptiveSizePolicy和-XX:+UseConcMarkSweepGC 初步猜想是 ...
- oracle出现sga导致ORA-00821 ORA-00093报错解决办法
本问题在linux环境下,windows环境下类似. 问题描述: 在数据库操作时不小心修改了share_pool的大小,导致重启数据库无法正常启动,报错为: SQL>startup; ORA-: ...
- [收藏转]由于CredSSP加密Oracle修正 导致远程桌面报错处理
原文:https://blog.csdn.net/lanwilliam/article/details/80346792 由于win103月份的一个更新,导致mstsc突然无法连接服务器了,报错如标题 ...
- vs2015 安装之后安装MSSM 2016 导致 vs启动报错 System.ArgumentException 已添加了具有相同键的项,ActivityLog.xml
如题,先是装了vs2015,开发什么的都没有问题,后来安装了SqlServer2016 MSSM,出大问题了,vs2015打开就报错,具体错误如上,还想还有个ActivityLog.xml 这个文件的 ...
- DB2 57016报错的解决办法(表状态不正常,导致表无法操作)
新建了一张表,删除了一列,然后执行insert的时候,报错 57016,解释为:因为表不活动. 1.执行db2 "load query table <tabname>" ...
随机推荐
- 2013年全国各大著名的IT公司薪资待遇大揭密
以下为转载,特此说明!--西电好网 ============================================ 1: 本人西电通院2013届毕业硕士,根据今年找工作的情况以及身边同学的汇 ...
- struts2中<s:property>的用法
1,访问Action值栈中的普通属性: <s:property value="attrName"/> 2,访问Action值栈中的对象属性(要有get set方法): ...
- 第二十三篇、使用NSURLSession时需要注意一个内存泄漏问题
如图1代码所示,初始化一个NSURLSession临时实例对象并由它发起一个网络请求.我们通过Instruments的Leaks工具会发现其存在内存泄漏和循环引用的地方,如图2所示. 通过NSURLS ...
- IOS开发之NSPredicate谓词的用法
编程的人员不管是上过大学还是从培训机构出来的或做后台的.前端的都应该SQL语句有所了解,我们知道,在SQL语句当中 where 条件表达式可以对二维关系表的数据做条件筛选.微软的C# .net中也实现 ...
- 两种js监听滚轮事件的方式
前段时间在写前端的时候,需要监听浏览器的滚轮事件 网上查了一下,找到两种监听滚轮事件的方法: 一.原生js通过window.onscroll监听 //window.onscroll = functio ...
- MVC异步 导入excel文件
View页面 js文件.封装到一个js文件里面 (function ($) { //可以忽略 var defaultSettings = { url: "http://upload.zhtx ...
- 安卓热更新之Nuwa实现步骤
安卓热更新之Nuwa实现步骤 最近热更新热修复的功能在安卓应用上越发火热,终于我的产品也提出了相应的需求. 经过两天的研究,搞定了这个功能,在这里还要多谢大神们的博客,大神们的原理分析很到位,不过对于 ...
- QtSQL学习笔记(1)- 概述
Qt SQL是Qt提供的核心模块,用以支持SQL数据库.Qt SQL的API被分为不同的层: ■ 驱动层 (Driver layer) ■ API层 (SQL API layer) ■ 用户接口层 ( ...
- Asp.net 图片文件防盗链介绍
想要实现文件放盗链的功能 首先添加一个全局文件 Global.asax 在 Application_BeginRequest中我们可以判断Http报文头中的UrlReferre是否来源本站. if ( ...
- sublime主题推荐
PS:之前在CSDN上写的文章,现在转到博客园~ 寒假的时候发现一个sublime主题,我觉得很赞哦~~推荐给大家~~ 下载方式 step1:ctrl+shift+p 调出command palet ...