PS:一下情况vs2015/Ming Qt5.10均会出现
第一步,启动QtCreator后,新建->项目(Applicaton)基类选择QDialog,然后对代码不做任何改动,直接编译,提示错误
error: undefined reference to `vtable for 类名'
然后注释掉Q_OBJECT宏,编译通过,运行OK
第二步,在这个自定义的QDialog上添加一个按钮,然后有代码
connect(cancel_PushButton,SIGNAL(clicked()),this,SOT(close()));
编译通过,运行程序后,点击按钮,程序关闭
这里的问题是该类的Q_OBJECT宏处于被注释掉的状态,但却可以正常使用信号与槽
第三步,在上面的自定义QDialog上再添加一个按钮,同时添加一个一个自定义槽,代码类似
connect(tk_PushButton,SIGNAL(clicked()),this,SLOT(testPro()));
编译时提示“没有槽testPro()”,鼠标点 tk_PushButtn没有反应(testPro()函数里面有qDebug()的输出)
原因是Q_OBJECT宏被注释,但是上面的关闭按钮任然可用。。。。
第四步 取消掉Q_OBJECT的注释,然后编译,失败,提示
error: undefined reference to `vtable for 类名'
然后百度了相关关键字(至某人),解决这类的问题的方法只有一个,删掉MOC文件,重新make,然后编译,但我试了删除所有除了源代码外的文件,重新编译,也尝试过在命令行使用
qmake -project
qmake testPro
mingw32-make
单结果是一样的,都编译失败,提示
error: undefined reference to `vtable for 类名'
今天一整天都没能解决这个问题,求帮助
15 个解决方案
#1
各路大神,你们在哪里。。。公司就我一个会Qt的,现在要用Qt做项目,但这个问题解决不了啊。。。。老板整天盯着我
#2
不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。
#3
再编译一次源码 笔误
#4
注释掉就可以运行,不注释掉编译出错,提示error: undefined reference to `vtable for 类名'
我试过删掉除了代码文件以外的所有文件及目录,包括debug和release目录,只要类李有Q_OBJECT宏就会提示error: undefined reference to `vtable for 类名' 这个错误
如果不添加Q_OBJECT宏,则可以编译运行
#5
.h文件
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
};
#endif // DIALOG_H
.cpp文件
#include "Dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
}
Dialog::~Dialog()
{
}
main.cpp文件
#include "Dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
这个是用QtCreator 创建的,我啥都没改,编译通过过,提示error: undefined reference to `vtable for 类名'
如果我把Q_OBJECT宏注释掉,编译通过,可以运行,
我把这三个文件意外的全部文件和目录都删了,编译还是这个样子,我把这三个文件拷贝到别的目录,使用命令行编译
qmake -project
qmake MocTest.pro
mingw32-make
结果还是提示error: undefined reference to `vtable for 类名'
#6
我用的Qt5.6.3,不用注释掉,ok的,你的Qt有点问题吧。。。
#7
我用的Qt5.6.3,不用注释掉,ok的,你的Qt有点问题吧。。。
我的qt是从qtcn.org上下载下来的。。。。不会是假的吧
http://mirrors.ustc.edu.cn/qtproject/official_releases/qt/5.9/5.9.5/qt-opensource-windows-x86-5.9.5.exe
这个是下载地址。。。
#8
我是这样的
#9
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。
#10
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。
重装了5.10版和5.7版,这两个版本是从qt官网上下的,测试还是这个问题
#11
看看你的项目构建配置有没有问题
#12
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。
还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定
#13
看看你的项目构建配置有没有问题
构建也没问题,只要不适用Q_BJECT宏程序就能编译运行,唯一可能的问题,是编译时有一个question
E:\MyPro\LoadingDialog\LoadingDialog.h:1: Note: No relevant classes found. No output generated.
#14
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。
还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定
产生的中间文件也是Qt产生的,自己产生,自己读取,应该不影响。你这个问题有点奇葩,不清楚哪的问题了。
#15
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。
还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定
产生的中间文件也是Qt产生的,自己产生,自己读取,应该不影响。你这个问题有点奇葩,不清楚哪的问题了。
悲剧啊。。。公司就我一个人用Qt的,都找不到人了问。。。。老板还在后面 催。。
#1
各路大神,你们在哪里。。。公司就我一个会Qt的,现在要用Qt做项目,但这个问题解决不了啊。。。。老板整天盯着我
#2
不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。
#3
不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。
再编译一次源码 笔误
#4
不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。
注释掉就可以运行,不注释掉编译出错,提示error: undefined reference to `vtable for 类名'
我试过删掉除了代码文件以外的所有文件及目录,包括debug和release目录,只要类李有Q_OBJECT宏就会提示error: undefined reference to `vtable for 类名' 这个错误
如果不添加Q_OBJECT宏,则可以编译运行
#5
不明白你注释掉Q_OBJECT干嘛,就不能正常的做吗。
不过我实测发现,直接删除掉编译出来的那个文件夹,再便宜一次源码可以解决,你看看是不是没删掉或者删错地方了。
再编译一次源码 笔误
.h文件
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
};
#endif // DIALOG_H
.cpp文件
#include "Dialog.h"
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
{
}
Dialog::~Dialog()
{
}
main.cpp文件
#include "Dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
这个是用QtCreator 创建的,我啥都没改,编译通过过,提示error: undefined reference to `vtable for 类名'
如果我把Q_OBJECT宏注释掉,编译通过,可以运行,
我把这三个文件意外的全部文件和目录都删了,编译还是这个样子,我把这三个文件拷贝到别的目录,使用命令行编译
qmake -project
qmake MocTest.pro
mingw32-make
结果还是提示error: undefined reference to `vtable for 类名'
#6
我用的Qt5.6.3,不用注释掉,ok的,你的Qt有点问题吧。。。
#7
我用的Qt5.6.3,不用注释掉,ok的,你的Qt有点问题吧。。。
我的qt是从qtcn.org上下载下来的。。。。不会是假的吧
http://mirrors.ustc.edu.cn/qtproject/official_releases/qt/5.9/5.9.5/qt-opensource-windows-x86-5.9.5.exe
这个是下载地址。。。
#8
我是这样的
#9
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。
#10
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。
重装了5.10版和5.7版,这两个版本是从qt官网上下的,测试还是这个问题
#11
看看你的项目构建配置有没有问题
#12
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。
还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定
#13
看看你的项目构建配置有没有问题
构建也没问题,只要不适用Q_BJECT宏程序就能编译运行,唯一可能的问题,是编译时有一个question
E:\MyPro\LoadingDialog\LoadingDialog.h:1: Note: No relevant classes found. No output generated.
#14
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。
还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定
产生的中间文件也是Qt产生的,自己产生,自己读取,应该不影响。你这个问题有点奇葩,不清楚哪的问题了。
#15
是不是你的宏被什么覆盖了,或者你不小心改动了Qt的头文件之类的,要不你重装一下试试?直接这样创建是可以运行的。
还有种可能的原因,是Qt编译过程中会生产一些中间文件,包括moc文件,我的系统默认生产的文件编码是ansi但Qt编译只能编译utf-8编码的文件,所以导致无法生成moc文件,单我不知道怎么修改系统(win7)自动生产的文件编码格式,所以还不能确定
产生的中间文件也是Qt产生的,自己产生,自己读取,应该不影响。你这个问题有点奇葩,不清楚哪的问题了。
悲剧啊。。。公司就我一个人用Qt的,都找不到人了问。。。。老板还在后面 催。。