Qt经典出错信息之undefined reference to `vtable for classname
这个出错信息太常见了,用过Qt两个月以上的朋友基本上都能自己解决了,因为太经典了,可以给新手参考。
出错信息一般类似:undefined reference to `vtable for classname MyWidget`
在执行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 const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); static inline QString tr(const char *s, const char *c = 0) { return staticMetaObject.tr(s, c); } static inline QString trUtf8(const char *s, const char *c = 0) { return staticMetaObject.trUtf8(s, c); } static inline QString tr(const char *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 int qt_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.
——
shiroki:另外我再加一句, 还有一种可能性是写代码的人把所有的代码都写在了.cpp文件中。要知道moc工具只读.h文件,如果把Q_OBJECT宏放在cpp里moc是看不到的……所以大家写代码还是要遵守声明放.h实现放cpp的规矩比较好。
Q_OBJECT undefined reference to 问题
摘自:http://waiter94.blog.163.com/blog/static/5277376920103423144138/
如果你的class的定义和身明 是放在同一cpp文件里 如: Test.cpp, 并且在class使用了slot/signal. 在这个cpp文件的最底部 加上
#include "文件名.moc" 会帮助你除去编译的问题
Qt 出现“undefined reference to `vtable for”原因总结
由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程式的时候,会碰到各种各样这样那样的问题,而且很多是很难,或根本很难找到原因的,即使解决了问题,假如有人问您为什么,您只能回答--不知道;
今天我在这里列举的问题也是再编写Qt程式时,总是碰到的问题,问题普遍,而答案却不唯一,解 释这一个问题的说法很多,往往只适合某一种情况,因为这个错误太笼统了,他就是-- “undefined reference to `vtable for”可能您看着很熟悉,似乎在c++程式中也碰到过这个问题,您说对了,有时候这个错误,不只是qt的原因,更有您的c++程式的原因;
下面搜集了网上的一些出现的现象,对应解决方法,原因,基本上我都验证过,收录于此,以做备份;
一:
预编译器打开宏Q_OBJECT,声明若干个由moc处理(implement)的成员函数。 假如得到类似于“undefined reference to vtable for LcdNumber”的编译错误(if you get compiler errors along the lines of "undefined reference to vtable for LcdNumber"),您可能是忘记了执行moc,或忘记了将moc输出加入到link命令里。
某一个类中假如加入Q_OBJECT后,则link时提示:undefined reference to vtable for "xxx::xxx".删掉他则没有任何问题.
解决:尝试(1):把任何的obj文档和uic文档删除,重新编译.仍然失败.
去trolltech的mail lists找到原因: 因为qmake生成Makefile的时候,这个类的头文档中并没有Q_OBJECT,所以在相应的Makefile里面并没有用moc xxx.h命令,最终导致链接失败.重新运行qmake,问题解决.
在查找解决方法的时候,附带发现一点:
qmake 不会处理.cpp文档里的Q_OBJECT,所以,假如在.cpp文档中有他的话,也会产生undefined reference to vtable for "xxx::xxx". 这时,需要先用moc xxxx.cpp生成相应的moc文档,再包含到.cpp里面去,才能解决这个问题.
这里能够发现问题的出现是因为没有moc生成相应的moc文档,之后连接就出问题。
我找了好多源码之类的问题,就是没有找pro的错误,后来想到qt中moc我们是有make做的
qt的make编译是根据Makefile来的,而Makefile是由pro文档来的。这才想到了找pro文档的错误。
from: http://www.cublog.cn/u/16292/showart_136087.html
二:
undefined reference to vtable for "xxx::xxx"
今天碰到了这个问题,终于被我google到了:
http://www.cublog.cn/opera/showart.php?blogid=8650&id=49526
原 因:qmake不会处理.cpp文档里的Q_OBJECT,所以,假如在.cpp文档中有他的话,也会产生undefined reference to vtable for "xxx::xxx". 这时,需要先用moc xxxx.cpp生成相应的moc文档,再包含到.cpp里面去,才能解决这个问题.
其他:
1.问题: QGLViewer中的函数不能正常link.解决: 翻看其源代码,发现是因为从源码安装libQGLViewer时,编译用了Qt 3,而我的程式中用Qt4 编译.所以必须重新用Qt4编译.但是,更改QTDIR 环境变量为Qt4后,重新编译的话,qmake生成makefile时就提示出错.进一步发现,是因为虽然设了QTDIR为Qt4,头文档和库文档都会使 用Qt4,但是moc,uic等都是用的qt3版的,再把PATH环境变量改变后,一切ok.
2.问题:某一个类中假如加入Q_OBJECT后, 则link时提示:undefined reference to vtable for "xxx::xxx".删掉他则没有任何问题.解决:尝试(1):把任何的obj文档和uic文档删除,重新编译.仍然失败.去trolltech的 mail lists找到原因: 因为qmake生成Makefile的时候,这个类的头文档中并没有Q_OBJECT,所以在相应的Makefile里面并没有用moc xxx.h命令,最终导致链接失败.重新运行qmake,问题解决.在查找解决方法的时候,附带发现一点:qmake 不会处理.cpp文档里的Q_OBJECT,所以,假如在.cpp文档中有他的话,也会产生undefined reference to vtable for "xxx::xxx". 这时,需要先用moc xxxx.cpp生成相应的moc文档,再包含到.cpp里面去,才能解决这个问题.
3. 看Qt的reference发现: 能够connect(pObjA, SIGNAL(someSignalA()),pObjB,SIGNAL(someSignalB()));这样pObjA发出的someSingalA 会导致pObjB发出someSignalB,从而形成信号接力.
Qt经典出错信息之undefined reference to `vtable for classname的更多相关文章
- Qt 经典出错信息之”Basic XLib functionality test failed!”(Z..z..)
此完整出错信息是在./configure阶段 Basic XLib functionality test failed! You might need to modify the include an ...
- Qt经典出错信息之”Basic XLib functionality test failed!”
解决方法: 此完整出错信息是在./configure阶段Basic XLib functionality test failed!You might need to modify the includ ...
- Qt——error之undefined reference to `vtable for classname
可能原因:自定义类中使用自定义槽和信号,但是没有在类中增加Q_OBJECT, 解决办法:在类中增加Q_OBJECT,删除编译产生的文件进行重新编译 具体原因分析如下 博主原文
- Qt 编译出错“undefined reference to `vtable for”
1. 有时,如果将某个类改为继承自QObject类(以前不继承自该类),编译时会出错. 解决: clean Project, run qmake, rebulid都运行一遍,好了! 因为qmake生成 ...
- (转) Qt 出现“undefined reference to `vtable for”原因总结
由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...
- Qt的“undefined reference to `vtable for”错误解决(手动解决,加深理解)
使用QT编程时,当用户自定义了一个类,只要类中使用了信号或槽. Code::Blocks编译就会报错(undefined reference to `vtable for). Google上有很多这个 ...
- Qt错误:类中使用Q_OBJECT宏导致undefined reference to vtable for "xxx::xxx"错误的原因和解决方法
在进行Qt编程的时候,有时候会将类的定义和实现都写在源文件中,如果同时在该类中使用信号/槽,那么可能就会遇到 undefined reference to vtable for "xxx:: ...
- Qt 出现“undefined reference to `vtable for”
在QT中定义了一个线程类,继承自QThread, 在类中未加 Q_OBJECT 时编译正常,加入后报错如下: undefined reference to `vtable for myThread' ...
- qt undefined reference to `vtable for subClass'
1. 建立一个console工程 QT -= gui CONFIG += c++ console CONFIG -= app_bundle # The following define makes y ...
随机推荐
- lcov和gcov的使用错误
编译使用的gcc版本和gcov的版本对不上的话,使用lcov和gcov的时候会报错 lcov的错误: [xx@localhost XXX]$ lcov --capture --directory co ...
- GridLayout 使用
上次做了一个小键盘,请见:PopupWindow 使用. 效果是这样的: 可以看到,上面的按键是不一样大小的.因为是用LinearLayout布局,用的Button样式也是默认的.数字键和文字键的大小 ...
- C和指针 第十六章 习题
16.8 计算平均年龄 #include <stdlib.h> #include <stdio.h> #define MAX_LEN 512 int main() { int ...
- 关于手机的内置SD卡与外置SD卡
对于安卓2.3的系统来说,Environment.getExternalStorageDirectory()获取的目录是内置SD卡还是外置SD卡是无法保证的, 和手机厂商的修改有关,只能通过Envir ...
- less入门
less入门 安装 首先安装node,执行命令 node install -g less安装完成后可以在任意窗口中使用lessc命令,将.less文件编译成css文件. 变量 可以像其他语言一样声明变 ...
- Webview和Html
参考http://blog.csdn.net/chenzheng_java/article/details/6260872 <html><header> <title&g ...
- 前端工具HBuilder安装Sass插件
HBuilder自带未安装的less插件,但是sass插件却没有,需要自己安装,步骤如下: 1.安装sass,参考: http://www.w3cplus.com/sassguide/install. ...
- 修改git remote url
$ ssh -v wangz@gitlab.alibaxx-inc.com $ git remote ali set-url git@gitlab.alibaxx-inc.com:youk-aaa/x ...
- 爬虫 htmlUnit遇到Cannot locate declared field class org.apache.http.impl.client.HttpClientBuilder.dnsResolve错误
当在使用htmlUnit时遇到无法定位org.apache.http.impl.client.HttpClientBuilder.dnsResolver类时,此时所需要的依赖包为: <depen ...
- Anti XSS 防跨站脚本攻击库
https://wpl.codeplex.com/ Before understanding Anti-Cross Site Scripting Library (AntiXSS), let us u ...