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.
参考自: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.
相关文章推荐
- Qt经典出错信息之undefined reference to `vtable for classname
- Qt中关于undefined reference to `vtable for classname`的问题
- Qt中关于undefined reference to `vtable for classname`的问题
- Qt中关于undefined reference to `vtable for classname`的问题
- Qt经典出错信息之undefined reference to `vtable for classname
- 【转】Qt经典出错信息之undefined reference to `vtable for classname'
- Qt经典出错信息之undefined reference to `vtable for classname
- Qt经典出错信息之undefined reference to `vtable for classname
- [Qt解错篇]报错:error: undefined reference to vtable for ClassName
- Qt经典出错信息之undefined reference to `vtable for classname
- Qt经典出错信息之undefined reference to `vtable for classn
- QT 编译 undefined reference to `vtable for Class
- QT中添加自定义Class,出现“undefined reference to vtable for”之解决方案(Eclipse+Linux)
- undefined reference to `vtable for class::method'--链接共享库时出现
- C++ 编译出现undefined reference to `vtable for Class 和 undefined reference to typeinfo for Class
- Qt经典出错信息之undefined reference to `vtable for classn
- Qt 出现“undefined reference to `vtable for”原因总结
- 自学QT之报错undefined reference to vtable for "xxx::xxx"
- C++爬坑日记(1) undefined reference to `vtable for
- QT出现“undefined reference to `vtable for’”问题的原因及解决方法【转】