代码之家  ›  专栏  ›  技术社区  ›  liaK

Q\u对象链接器错误!

  •  12
  • liaK  · 技术社区  · 15 年前

    HIMyClass.obj::错误: 未解析的外部符号“public: 虚拟结构QMetaObject const* __thiscall CHIMyClass::元对象(void)常量 " (?metaObject@CHIMyClass@@UBEPBUQMetaObject@@XZ) 未找到文件:HIMyClass.obj

    HIMyClass.obj::错误: 未解析的外部符号“public: 虚拟空*\u此调用 CHIMyClass::qt\u metacast(字符 常量*)“

    HIMyClass.obj::错误: 虚拟国际电话 CHIMyClass::qt\u metacall(枚举 QMetaObject::Call,int,void**) (?qt_metacall@CHIMyClass@@UAEHW4Call@QMetaObject@@HPAPAX@Z)未找到文件:HIMyClass.obj

    class CHIMyClass:public QDialog
    {
       Q_OBJECT
    
       ....
    
    };
    

    当我注释qu对象时,链接器错误就消失了( 显然我不能使用信号和插槽 ). 我使用Qt Creator作为IDE和qt4.5.3。当我给予 重建全部 很明显 将被调用。我想,问题出在moc文件的生成上。我使用windowsxp和cl作为编译器。

    这个链接器错误背后的原因可能是什么?

    11 回复  |  直到 15 年前
        1
  •  29
  •   chalup    15 年前

    这样的错误通常意味着您没有将类的头添加到pro文件中的“HEADERS”变量中(元对象编译器只为这个变量中列出的头生成moc文件)。请记住在更改.pro文件后运行qmake!

        2
  •  13
  •   sakisk    14 年前

    我有一个类似的问题,它解决了安德烈夫的反馈。在QT Creator中,我只是:

    1. 生成/运行qmake
    2. 生成/运行
        3
  •  2
  •   Stephen Quan    6 年前

    无论何时更改QObject继承,请确保执行 clean , qmake build . 这个 Q制造商 这一点很重要,因为它会为.h文件中的任何新Qt更改更新moc*文件,包括QObject继承,即 Q_OBJECT . 事实上,在某些情况下,你甚至可以简单地 然后 建造 对于增量构建。

        4
  •  1
  •   Trevor Hickey    9 年前

    签入文件 MakeFile.debug HIMyClass

    我只是重新命名 ,清理项目并全部重新生成,然后编译。

        5
  •  1
  •   Trevor Hickey    9 年前

    我也有同样的问题,但在我的情况下,它不足以清洁->建造。所以我不得不手动删除所有在构建过程中创建的文件(Mekefiles,cpp中的ui描述,以及通常由构建过程创建的整个目录),然后构建成功。

        6
  •  0
  •   Community CDub    8 年前

    检查pro文件中是否存在必要的Qt配置选项( QT += core gui moc 由于某种原因无法运行。

    更新: this 相关 这个问题似乎建议您在编译时不要定义QT\u DLL。你可以尝试一个新的简单的QtCreator项目(例如,带有一个mainwindow子类的小部件)并尝试一下。它应该自动包含一个Q\u对象头,并尝试比较.pro文件和编译器输出。

        7
  •  0
  •   Community CDub    5 年前

    我将向qt提交一个bug。

    注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。

    “vtable for MainWindow”,引用自:

     MainWindow::MainWindow(QWidget*)in mainwindow.o
    
        8
  •  0
  •   user3079474    11 年前

    我找到了这个错误的另一个可能的原因和解决方法

    如果在.h文件中声明了插槽,但在实现中没有定义其主体,也会发生此错误

        9
  •  0
  •   RN3KK Nick    10 年前

    我有这个问题。 验证.cpp文件中是否有插槽实现的说明。

        10
  •  0
  •   kayleeFrye_onDeck    9 年前

    我已经搬走了 #include "main.moc" 从我的主文件,忘记了重新添加它。。。那真是浪费时间!

        11
  •  0
  •   vinaymk    9 年前

    1.已将类定义移到头文件。 3.全部清除 5.从项目目录中删除makefile 6.打开QtCreator并打开项目。 7.Qmake以确保生成makefile。

    这些步骤帮助我解决了这个问题-我挣扎了一个多小时与各种其他的答案和方法-没有任何工作。运行qmake之前,请确保删除makefiles并关闭QtCreator(至少适用于windows 10)。