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()


我找到了手动执行 q​​make 的建议。我从来没有手动使用过 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 引用”问题

Qt,来自子类的“没有这样的信号”运行时错误,具有 Q_OBJECT 宏

Qt - moc 导致 C2504:基类未定义

Qt5 在添加 Q_OBJECT 后发现编译出错的原因

急求Q_OBJECT问题

qt中moc的作用