【问题标题】:Q_OBJECT linker error!Q_OBJECT 链接器错误!
【发布时间】:2011-03-16 21:48:49
【问题描述】:

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

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

HIMyClass.obj:: 错误: 未解析的外部符号“公共: 虚空 * __thiscall CHIMyClass::qt_metacast(char 常量 *)" (?qt_metacast@CHIMyClass@@UAEPAXPBD@Z) 找不到文件:HIMyClass.obj

HIMyClass.obj:: 错误: 未解析的外部符号“公共: 虚拟 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。当我给出 Rebuild All 时,肯定会调用 QMake。我想,它的 moc_* 文件的生成是问题所在。我使用的是 Windows XP 和 cl 作为编译器。

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

【问题讨论】:

  • 也许File not found : HIMyClass.obj 告诉我们,Qt Creator 没有看到 moc/obj/temp 文件?
  • 真的,重新运行 qmake。此外,请检查 .pro 文件中是否缺少或多余的“\”字符。

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


【解决方案1】:

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

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

更新:thisrelated 问题似乎表明您在编译时没有定义 QT_DLL。您可以尝试一个全新的简单 QtCreator 项目(例如,使用子类化主窗口的小部件)并尝试一下。它应该自动包含一个 Q_OBJECT 标头并尝试比较 .pro 文件和编译器输出。

【讨论】:

  • 缺少的不是 Qt 符号,而是他自己的类的 moc 生成的符号。因此,我宁愿使用 chalup 并检查 HEADERS 中列出的标题。一个完全干净的构建也可能会有所帮助。
  • 它可以很好地链接所有其他具有 Q_OBJECT 宏的类。 @Frank,我将文件包含在 HEADERS 部分中,并多次尝试干净的构建.. 不过运气不好.. :(
【解决方案2】:

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

【讨论】:

  • 相应的头文件已经在 HEADERS 变量下可用,但仍然面临问题.. 这不是原因.. 至少在我的情况下.. :(
  • 手动删除qmake生成的所有文件和所有目标文件,然后重新运行qmake。
  • @chalup,我删除了所有的 MOC、OBJ、RCC 文件并运行 qmake,现在它工作正常。虽然很高兴它起作用了,但这太疯狂了..为什么会出现这种未定义的行为?有什么猜测吗??
  • 它不是未定义的。实际上,这是非常确定的: 1. 创建一个扩展 QObject 但忘记添加 Q_OBJECT 的类。 2. qmake 3. make 4. 将 Q_OBJECT 添加到类中。 5. make 6. 同样的错误。 7. qmake 8. make 9. 没有更多错误。 Qmake 只会将“moc”规则添加到 HEADERS 中在某处具有带有 Q_OBJECT 宏的类的那些文件。
【解决方案3】:

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

我只是重命名MakeFile.debug,清理项目并重新构建所有项目并编译。

【讨论】:

    【解决方案4】:

    我遇到了类似的问题,并通过 andref 的反馈解决了。在 QT Creator 中,我只是:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        在我的 osx 盒子上,这是由于缺少 moc* 文件。 我通过从我的 utf-8 编码的 .pro 文件中删除 bom 来解决这个问题。 我会用 qt 提交一个错误。

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

        "vtable for MainWindow",引用自:

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

              我遇到了这个问题。 验证.cpp文件中是否有slot实现的描述。

              【讨论】:

                【解决方案10】:

                我已经从我的主文件中删除了#include "main.moc",却忘记重新添加它了……那真是浪费时间!

                【讨论】:

                  【解决方案11】:

                  @chalup 和 @ierax 的回答帮助了我。我必须关闭 Qt 创建器并再次打开它才能使 qmake 生效。我按照以下步骤操作: 1. 将类定义移至头文件。 2. 将头文件添加到项目中,并确保它在 .pro 文件中的 HEADERS += \ 列表中列出。 3. 一尘不染 4. 关闭 QtCreator(在 Windows 10 上) 5.从项目目录中删除Makefiles 6. 打开 QtCreator 并打开项目。 7. Qmake 确保生成makefile。 8. 全部重建

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-08-04
                    • 2012-08-12
                    • 2012-06-30
                    • 2016-03-31
                    相关资源
                    最近更新 更多