Q_OBJECT undefined reference to 问题
来源:互联网 发布:php多线程 swoole 编辑:程序博客网 时间:2024/06/05 07:40
如果你的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,从而形成信号接力.
- Q_OBJECT undefined reference to 问题
- 由Q_OBJECT引起的undefined reference to vtable for "xxx::xxx"问题
- 由Q_OBJECT引起的undefined reference to vtable for "xxx::xxx"问题
- undefined reference to `sqrt' 问题
- undefined reference to `sqrt' 问题
- undefined reference to 'pthread_create' 问题
- undefined reference to `open_port'问题
- codeblocks undefined reference to 问题
- undefined reference to `sqrt'问题
- undefined reference to `sqrt' 问题
- undefined reference to `sqrt' 问题
- undefined reference to 问题总结
- CMake undefined reference to 问题
- qt creator中Q_OBJECT导致出现undefined reference to vtable for 的错误
- undefined reference to 'dlopen';undefined reference to 'dlclose';undefined reference to 'dlerror'等问题
- undefined reference to `__ctype_b_loc' 的问题
- undefined reference to涉及的链接问题
- (转)undefined reference to 'pthread_create'问题
- chapter 1~2
- ACM 重构二叉树 C++实现
- First WCF App (Host in Console Application)
- 子线程中Toast
- images
- Q_OBJECT undefined reference to 问题
- SDK_r14和ADT14.0.0 的android环境搭载
- 小规模低性能低流量网站设计原则
- java多态中构造器的调用顺序研究
- 在线为Eclipse安装SVN插件
- JavaScript_form表单非空验证;
- maven笔记5
- Service engineering
- Maven 3的10大新特性详解