由于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,从而形成信号接力.
from:http://blog.donews.com/netexe/archive/2006/02/09/720544.aspx
三:编译报错的部分是:
CODE:
[Copy to clipboard]
tmp\obj\release_shared\myplot.o(.text+0x194):myplot.cpp: undefined reference to
`vtable for MyPlot'
tmp\obj\release_shared\myplot.o(.text+0x19b):myplot.cpp: undefined reference to
`vtable for MyPlot'
tmp\obj\release_shared\myplot.o(.text+0x934):myplot.cpp: undefined reference to
`vtable for MyPlot'
tmp\obj\release_shared\myplot.o(.text+0x93b):myplot.cpp: undefined reference to
`vtable for MyPlot'
collect2: ld returned 1 exit status你 MyPlot 是不是声明了什么 virtual 的 方法, 但在实现(cpp)文件里没有实现。
看了一下, 现在推测一下。 MyPlot 继承了 QwtPlot, 现在报的这个错, 应该是这个意思,
1. QwtPlot 里含有 vritual 方法, 所以你的继承类需要一个 virtual 的析构函数
2. QwtPlot 里含有 纯虚的方法, 你没有继承, 而这个可能性比较小
所以, 你可以:
在MyPlot里声明一下一个虚的析构函数
virtual ~MyPlot() {}
我们来看一个简单些的例子吧:
#include <qapplication.h>
#include <qpushbutton.h>
class myWidget :public QWidget
{
Q_OBJECT
public:
myWidget(QWidget *parent = 0);
public slots:
void shutDown();
private:
QPushButton *exit;
};
myWidget::myWidget(QWidget *parent):QWidget(parent)
{
setMinimumSize(120, 180);
setMaximumSize(120, 180);
exit = new QPushButton("ShutDown!",this);
connect(exit,SIGNAL(clicked()),this,SLOT(shutDown()));
}
void myWidget::shutDown()
{
system("halt");
}
int main(int argc, char **argv)
{
QApplication app(argc, argv);
myWidget *w = new myWidget();
w->show();
app.exec();
}
还是报错:
shut.o(.text+0x21): In function `myWidget::myWidget[not-in-charge](QWidget*, char const*)':
: undefined reference to `vtable for myWidget'
shut.o(.text+0x28): In function `myWidget::myWidget[not-in-charge](QWidget*, char const*)':
: undefined reference to `vtable for myWidget'
shut.o(.text+0x141): In function `myWidget::myWidget[in-charge](QWidget*, char const*)':
: undefined reference to `vtable for myWidget'
shut.o(.text+0x148): In function `myWidget::myWidget[in-charge](QWidget*, char const*)':
: undefined reference to `vtable for myWidget'
collect2: ld returned 1 exit status这是我从l搜索引擎上搜到的例子,从代码中好像看不到明显的错误吧
我自己试了一下编译也是出错
刚才那个简单的例子的原因可能是这样的:
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里面去,才能解决这个问题.知道你的问题了, 上面的例子不好, 因为你这个把main和类放在一起了。 如果分开, 可能就没问题, 包括 h和 cpp 分开。
要解决上面的问题, 在你main.cpp 最后加一行
#include "main.moc"
然后把除了 main.cpp 的其它文件都删了。重新来, 没问题的。
所以, 我估计你前面提到的问题也是没有链接 moc 文件。 你在你的 myplot.cpp 文件最后加一行: #include "myplot.moc" 试试看。
另外: 你main 没有返回值, 编译会警告, 而且程序最后一行不是只含有回车, 也会警告。
http://blog.csdn.net/chenlong12580/article/details/7431104
(转) Qt 出现“undefined reference to `vtable for”原因总结的更多相关文章
-
Qt 出现“undefined reference to `vtable for”原因总结
http://blog.csdn.net/chenlong12580/article/details/7431104
-
Qt的“undefined reference to `vtable for”错误解决(手动解决,加深理解)
使用QT编程时,当用户自定义了一个类,只要类中使用了信号或槽. Code::Blocks编译就会报错(undefined reference to `vtable for). Google上有很多这个 ...
-
Qt 出现“undefined reference to `vtable for”
在QT中定义了一个线程类,继承自QThread, 在类中未加 Q_OBJECT 时编译正常,加入后报错如下: undefined reference to `vtable for myThread' ...
-
Qt经典出错信息之undefined reference to `vtable for classname
原文链接:Qt经典出错信息之undefined reference to `vtable for classname 这个出错信息太常见了,用过Qt两个月以上的朋友基本上都能自己解决了,因为太经典了, ...
-
Qt错误:类中使用Q_OBJECT宏导致undefined reference to vtable for ";xxx::xxx";错误的原因和解决方法
在进行Qt编程的时候,有时候会将类的定义和实现都写在源文件中,如果同时在该类中使用信号/槽,那么可能就会遇到 undefined reference to vtable for "xxx:: ...
-
qt undefined reference to `vtable for subClass&#39;
1. 建立一个console工程 QT -= gui CONFIG += c++ console CONFIG -= app_bundle # The following define makes y ...
-
Qt - 错误总结 - 在自定义类头文件中添加Q_OBJECT 编译时报错(undefined reference to ‘vtable for xxThread)
错误提示:在添加的QThread子类头文件添加Q_OBJECT时,编译程序,出现"undefined reference to 'vtable for xxThread'"错误提示 ...
-
Qt :undefined reference to vtable for ";xxx::xxx";
现象: 类加上宏 Q_OBJECT 就会报错 :undefined reference to vtable for "xxx::xxx" 解决方法: 重新 qmake 其他情况,查 ...
-
Qt 编译出错“undefined reference to `vtable for”
1. 有时,如果将某个类改为继承自QObject类(以前不继承自该类),编译时会出错. 解决: clean Project, run qmake, rebulid都运行一遍,好了! 因为qmake生成 ...
随机推荐
-
asp.net MVC 安全性[笔记]
1. 跨站脚本(XSS) 1.1 介绍 1.1.1 被动注入,利用输入html,javascript 等信息伪造链接,图片等使用提交信息,调转页面等 1.1.2 主动注入,黑客主动参与攻击,不会傻等倒 ...
-
Unity3d之协程自实现测试
using UnityEngine; using System.Collections; public class TestStartCoroutine : MonoBehaviour { IEnum ...
-
python 库安装笔记
python 库安装笔记 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-2-22 友情提示 安装python库的过程中 ...
-
MM们,你们为什么要找一个程序猿男票?
前言 免责声明:这篇文章关于什么?六一儿童节马上就要到了,作为一个前端攻城师,自我感觉效率还可以,老早已把任务搞完,页面布局和前端编码高效按时交付,呵呵.趁有时间,写写文章娱乐一下.MM们,请不要拿起 ...
-
switch case异常处理机制
public class T3{ public static void main(String[] args) { try{ String kc=""; System.out.pr ...
-
完成你的第一个superMap示例
1.从官网下载superMap安装包,我选择setup包 2.解压压缩文件后,按照readme指导书,运行setup.exe进行安装 解压后压缩包包含文件: 执行setup.exe进行安装,其中Sup ...
-
C# Json处理相关
最近工作中遇到的Json问题确实很头大,主要是各种转义符的处理,想了一种通用的方式,来处理任意转移方式的Json字符串: /// <summary> /// 去除返回值中的转义符,返回js ...
-
Android TextView 跑马灯效果 - 2018年6月19日
第一步在布局中添加加粗部分代码: <TextView android:id="@+id/tv_company" android:layout_width="0dp& ...
-
unity 3d音效如何设置?,近大远小
请问怎么将导入的音频文件设置为“3D Sound”?这是我导入的音频文件: 现在3D音效的设置不在导入音效文件的地方,而是在AudioSource的SpatialBlend属性,0表示2D,1表示3D ...
-
Mybatis-generator插件,用于自动生成Mapper和POJO
后台环境为springboot+mybatis. 步骤一:添加mybatis环境 <dependency> <groupId>mysql</groupId> < ...