【问题标题】:Qt and no moc_*.cpp fileQt 并且没有 moc_*.cpp 文件
【发布时间】:2010-09-15 16:51:35
【问题描述】:

我正在开发一个简单的 Qt 4 应用程序并制作我自己的对话框。我将QDialog 子类化,在类声明块中插入了Q_OBJECT 宏,然后......我明白了

[链接器错误] 未定义对 `vtable for MyDialog' 的引用并且没有 moc 编译器生成的 moc_MyDialog.cpp。

我在 Windows XP 和 mingw 上使用 Qt 4.1.3。我遵循了 Qt 提供的构建 shell 的构建过程。我使用 qmake 创建 make 文件并使用 make 命令编译所有内容。

我有其他类分别是QPushButtonQObject 的子类,但它们编译正常。我找不到他们和坏人之间的任何区别。

破课中一定有什么遗漏,但我找不到。

【问题讨论】:

    标签: c++ qt qt4


    【解决方案1】:

    对“vtable for MyDialog”的消息未定义引用也可能是 MyDialog 派生的类中缺少纯虚函数的实现(在 MyDialog 中)的结果。

    【讨论】:

      【解决方案2】:

      我发现只有在添加一个没有扩展的类然后手动添加扩展时才会出现问题。

      为了解决这个问题,我将 Q_OBJECT 放在类的 .h 中,然后右键单击“源”->“添加现有文件...”,选择我修改后的类的 .ccp。

      【讨论】:

        【解决方案3】:

        如果您包含头文件,请按照以下步骤操作:

        1. 右键单击您已添加此项的项目。
        2. 点击“运行 qmake”。

        这将清除旧的引用并使用 Q_OBJECT 宏进行构建。 QT 在重建时不会这样做。

        【讨论】:

          【解决方案4】:

          “vtable for MyDialog”的未定义引用是由于没有 moc 文件引起的。大多数 c++ 编译器在包含第一个虚函数的目标文件中创建 vtable 定义。当子类化一个 qt 对象并使用 Q_OBJECT 宏时,这将在 moc*.cpp 文件中。因此,这个错误意味着moc文件丢失了。

          我能想到的可能问题有:

          1. 类 MyDialog.h 的头文件没有添加到 qmake 文件的 HEADERS 中。

          2. 您在添加 Q_OBJECT 宏之前运行了 qmake 来生成 make 文件。这创建了一个没有 moc 规则的 make 文件。只需再次运行 qmake 即可轻松解决此问题。

          3. 您的对话框派生自多个类,而 QDialog 不是它派生的第一个类。为了让 qmake 正常工作,QObject 派生的基类必须是第一个继承自的类。

          4. 如果您使用的是 Qt Creator,如果您之前的部署由于某种原因(例如应用程序已在运行)失败,您可能会收到此错误。在这种情况下,只需执行“Clean Project”,然后“Rebuild Project”,然后“Run”即可部署。

          【讨论】:

          • 我遇到这个问题还有一个原因: 5. 文件路径太长。我主要在 Windows 上经历过这种情况,其中构建系统的某些部分受到 Windows 古老的 255 个字符限制。
          • 另外:在 .pro 文件中没有 QT += gui 给了我 Qt 4.7.4 的这种行为。
          • qmake 只在当前目录中寻找头文件 - 所以如果头文件在不同的目录中,你应该在 HEADERS 中指定完整路径。
          • 必须有完整的路径名,即: HEADERS += src/*.h won't work you need HEADERS += src/metafile.h
          【解决方案5】:

          我谦虚地建议您使用CMake 在 Windows 上构建 Qt 程序。它会让您记住将适当的文件添加到其构建文件中。

          额外的价值是您可以从中生成 make/nmake 构建文件,Visual Studio 解决方案文件。如果您从 Visual Studio 的源代码编译 Qt,您将能够使用 MS IDE/编译器进行编码和构建。

          当然,如果您使用的是 Visual Studio。

          【讨论】:

            【解决方案6】:

            你在使用 qmake 吗?也许您没有将它添加到您的 .cpp 文件到您的 SOURCES 和 .h 文件到您的 qmake 文件中的 HEADERS 变量?

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-11-13
              • 1970-01-01
              • 2012-04-20
              • 1970-01-01
              • 1970-01-01
              • 2018-10-01
              相关资源
              最近更新 更多