您的位置:首页 > Web前端

undefined reference to `vtable for classname

2012-10-25 21:08 429 查看
首先说明,红色字体部分为原创

参考自:http://zzqh007.blog.163.com/blog/static/444348472010101541129182/

简单的说就是定义信号和槽连接的时候在头文件处没写Q_OBJECT却在cpp中用到了信号和槽。QT会提醒要添加Q_OBJECT这句话,但添加之后再编译就会出现undefinedreference to `vtable forclassname这样的错误。因为QT没有生成需要的moc文件并且即使更改过也不会再次生成了。解决的方法是Qmake一遍或者新开一个QT再把原码复制黏贴一遍。或者找到MakeFile,删除,重新点击编译按钮即可。

 

以下是作者原文:

< meta name="Keywords" content="CuteQt, Qt,Qtopia, Meego, Qt for Symbian, Maemo, Qt Embedded, Mobile"/>

本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息、原文链接、原文作者的情况下允许转载,转载请勿删改原文内容,并不得用于商业用途。 谢谢合作。
本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息、原文链接、原文作者的情况下允许转载,转载请勿删改原文内容,并不得用于商业用途。 谢谢合作。

这个出错信息太常见了,用过Qt两个月以上的朋友基本上都能自己解决了,因为太经典了,可以给新手参考。

出错信息一般类似:undefined reference to `vtable for classnameMyWidget`

在执行make命令后出现。

出错原因是在定义类的时候为了能使用signals和slot,在类定义的后面加了Q_OBJECT引起。因为Q_OBJECT是一个宏,在不同的类中展开是不同的代码,例如在mywidgeth.h中生成的

public: template inline void qt_check_for_QOBJECT_macro(const T&_q_argument) const { int i =qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i= i; } static const QMetaObject staticMetaObject; virtual constQMetaObject *metaObject() const; virtual void *qt_metacast(constchar
*); static inline QString tr(const char *s, const char *c = 0){ return staticMetaObject.tr(s, c); } static inline QStringtrUtf8(const char *s, const char *c = 0) { returnstaticMetaObject.trUtf8(s, c); } static inline QString tr(constchar *s, const char *c,
int n) { return staticMetaObject.tr(s, c,n); } static inline QString trUtf8(const char *s, const char *c,int n) { return staticMetaObject.trUtf8(s, c, n); } virtual intqt_metacall(QMetaObject::Call, int, void **); private:
可以看到以上的代码声明了3个从父类继承的3个虚函数。本来这三个函数的实现应该是由moc_mywidget.cpp来完成。

而当前的错误正是因为Makefile里没有将moc_mywidget.cpp加入编译引起。

Makefile背后的原因是qmake,因为Qt的编译系统是通过qmake将.pro文件转换成Makefile文件。当qmake扫描.h代码时发现有Q_OBJECT这样字眼的代码时,会将一个用moc生成moc_xxx.cpp代码的依赖关系写到Makefile里。如果扫描时没有找到Q_OBJECT就不会生成额外的moc_xxx.cpp这样的文件。

出现最初一幕的原因是在执行qmake的时候.h代码里并没有O_OBJECT这样的代码。而执行make的时候.h里已经有Q_OBJECT了,解决的方法就是重新执行qmake,然后执行make.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: