Qt C++ Q_OBJECT 错误未定义对 vtable 的引用
Posted
技术标签:
【中文标题】Qt C++ Q_OBJECT 错误未定义对 vtable 的引用【英文标题】:Qt C++ Q_OBJECT error undefined reference to vtable 【发布时间】:2017-01-13 08:52:42 【问题描述】:我在使用 Q_OBJECT 宏时经常遇到问题:(我使用 QT Creator 2.8.1 / Qt 4.8.4)我之前问过,但这似乎会导致更多麻烦。有谁能够帮助我?我完全迷路了。
我有一个庞大的 C++ 程序,其中包含大约 50 多个类来适应新的需求。 现在我在 src 目录的一个新目录中创建了一个新的(非常简单的)父类和 3 个子类。为此,我使用了模板 Qt->Qt Designer Form Class。(我这样做是因为即使我不需要 *.ui 文件,它也会自动实现 Q_OBJECT。然后我删除了所有有关 ui -文件和 ui 文件本身))
当我运行我的程序时,我总是得到很多“undefined reference to vtable for” ..-errors。当我删除所有 Q_OBJECT 时,我的程序运行正常。但是我无法使用以后需要的信号槽。
我在互联网上查找了它,发现它与我的构建目录中的 .pro-file/.o-Files 有关。我(多次)尝试删除所有 .o-Files 包括 .pro.user 并再次编译。有时我仍然得到错误,有时没有。
这是我的代码(目前 3 个子类相同):
geometry.h:
#ifndef GEOMETRY_H
#define GEOMETRY_H
#include <QMetaType>
#include <QWidget>
#include <QObject>
#include <QDebug>
class Geometry
Q_OBJECT
protected:
public:
Geometry();
virtual ~Geometry(void)
virtual void write_LNE();
//Q_DECLARE_METATYPE(Geometry);
#endif // GEOMETRY_H
-
geometry.cpp:
#include "geometry.h"
Geometry::Geometry()
qDebug() << "Constructor: hier ist Geometry";
void Geometry::Haupt()
qDebug() << " Das hier ist die Haupt von Geometry ....." ;
void Geometry::write_LNE()
-
Geo_1PF.h:
#ifndef GEO_1PF_H
#define GEO_1PF_H
#include "geometry.h"
class Geo_1PF : public Geometry
Q_OBJECT
public:
Geo_1PF();
~Geo_1PF()
virtual void write_LNE();
;
//Q_DECLARE_METATYPE(Geo_1PF);
#endif // GEO_1PF_H
Geo_1PF.cpp:
#include "Geo_1PF.h"
Geo_1PF::Geo_1PF()
我找到了手动执行 qmake 的建议。我从来没有手动使用过 qmake。
我如何以及从哪个目录执行此操作?我到底要写什么 qmake ......? 使用模板Qt->Qt Designer Form Class来创建这些类是否正确?我必须在另一个目录中创建类吗?
我需要在 +.pro 文件中添加其他条目吗
它们必须放在文件的什么位置?
我必须更改我的 makefile 中的任何内容吗?如果是这样呢?
谢谢
【问题讨论】:
【参考方案1】:如果您使用 Qt Creator: 每次使用 Q_OBJECT 创建类时,
构建 → 运行 qmake
构建 → 全部重建
【讨论】:
谢谢!这也为我解决了问题。【参考方案2】:要在你的类中使用 QOBJECT 宏,你需要扩展 QObject。
class MyObject: public QObject
Q_OBJECT
public:
MyObject (QObject *_parent);
.....
;
【讨论】:
我仍然得到对 vtable-Error 的未定义引用 有时 moc 文件不会重新生成,因此您必须 Build->Clean all 并 Build->Run qmake 这通常可以解决这些问题。以上是关于Qt C++ Q_OBJECT 错误未定义对 vtable 的引用的主要内容,如果未能解决你的问题,请参考以下文章
Q_OBJECT 导致“未定义的 v_table 引用”问题