zoukankan      html  css  js  c++  java
  • Qt 出现“undefined reference to `vtable for”原因总结 (ZZ)

    转载 :http://hi.baidu.com/apxmgsfergbdkxq/item/a466a7d58558d34dddf9beda
    Qt 出现“undefined reference to `vtable for”原因总结 (ZZ)
    由于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,从而形成信号接力.

  • 相关阅读:
    hdu 4710 Balls Rearrangement()
    hdu 4707 Pet(DFS水过)
    hdu 4706 Children's Day(模拟)
    hdu 4712 Hamming Distance(随机函数暴力)
    csu 1305 Substring (后缀数组)
    csu 1306 Manor(优先队列)
    csu 1312 榜单(模拟题)
    csu 1303 Decimal (数论题)
    网络爬虫
    Python处理微信利器——itchat
  • 原文地址:https://www.cnblogs.com/claruarius/p/Qt_undefined_reference_to_vtable_for.html
Copyright © 2011-2022 走看看