Q_OBJECT链接器错误!

时间:2010-07-16 11:20:03

标签: c++ qt qt4 linker-errors qobject

构建应用程序时,我收到以下链接器错误。

  

HIMyClass.obj ::错误:   未解决的外部符号“public:   虚拟结构QMetaObject const *   __thiscall CHIMyClass :: metaObject(void)const   “   (?元对象@ CHIMyClass @@ UBEPBUQMetaObject @@ XZ)   找不到档案:HIMyClass.obj

     

HIMyClass.obj ::错误:   未解决的外部符号“public:   virtual void * __thiscall   CHIMyClass :: qt_metacast(CHAR   const *)“   (?qt_metacast @ CHIMyClass @@ UAEPAXPBD @ Z)找不到档案:HIMyClass.obj

     

HIMyClass.obj ::错误:   未解决的外部符号“public:   virtual int __thiscall   CHIMyClass :: qt_metacall(枚举   QMetaObject :: Call,int,void * *)“   (?qt_metacall @ CHIMyClass @@ UAEHW4Call @ QMetaObject @@ HPAPAX @ Z)找不到档案:HIMyClass.obj

我的班级声明就像

class CHIMyClass:public QDialog
{
   Q_OBJECT

   ....

};

当我评论Q_OBJECT时,链接器错误消失(,显然我无法使用信号和插槽)。我使用Qt Creator作为IDE和Qt 4.5.3。当我提供重建全部时,肯定会调用 QMake 。我想,它产生的moc_ *文件就是问题所在。我使用Windows XP和cl作为编译器。

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

11 个答案:

答案 0 :(得分:28)

此类错误通常意味着您尚未将类的标题添加到pro文件中的“HEADERS”变量(元对象编译器仅为此变量中列出的标题生成moc_文件)。记得在更改.pro文件后运行qmake!

答案 1 :(得分:12)

我遇到了类似的问题,并且使用了andref的反馈解决了这个问题。在QT Creator中,我只是:

  1. 构建/清除所有
  2. 构建/运行qmake
  3. 构建/运行

答案 2 :(得分:2)

每当您更改QObject继承时,请务必执行cleanqmake然后buildqmake很重要,因为它更新了.h文件中包含QObject继承的任何新Qt更改的moc *文件,即Q_OBJECT。实际上,在某些情况下,您甚至可以简单地执行qmake然后build进行增量构建。

答案 3 :(得分:1)

签入文件MakeFile.debug,可能HIMyClass不存在。

我只是重命名MakeFile.debug,清理项目并重建所有内容并进行编译。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

检查专业文件(QT += core gui)中是否存在必要的Qt配置选项。同时尝试手动删除构建目录中构建/创建的所有内容。有时会发生moc无法运行出于某种原因。

您也可以尝试自己运行moc命令,看看它输出的内容(您可以在QtCreator的“编译输出”选项卡中找到命令行。

更新:this 相关的问题似乎建议您在编译时不要定义QT_DLL。你可以尝试一个全新的简单的QtCreator项目(例如,使用一个以mainwindow为子窗口的小部件)并试试。它应该自动包含一个Q_OBJECT头,并尝试比较.pro文件和编译器输出。

答案 6 :(得分:0)

在我的osx框上

这是由于缺少moc *文件。 我通过从我的utf-8编码的.pro文件中删除bom来解决这个问题。 我将用qt。

提交一个错误 护目镜搜索的

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

  

" vtable for MainWindow",引自:

 MainWindow::MainWindow(QWidget*)in mainwindow.o

答案 7 :(得分:0)

我发现了另一个可能的原因并解决了这个错误

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我已从我的主文件中删除了#include "main.moc",忘记重新添加...这是一个有趣的时间浪费!

答案 10 :(得分:0)

来自@chalup和@ierax的答案帮助了我。我必须关闭Qt创建者并再次打开它,但qmake才能生效。我按照以下步骤操作: 1.将类定义移动到头文件。 2.将头文件添加到项目中,并确保它针对.pro文件中的HEADERS + = \ list列出。 干净利落 4.关闭QtCreator(在Windows 10上) 5.从项目目录中删除Makefile 6.打开QtCreator并打开项目。 7. Qmake确保生成makefile。 8.重建所有

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