17

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

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

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

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

破课中一定有什么遗漏,但我无法发现。

4

6 回答 6

36

未定义对“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,如果您之前的部署由于某种原因(例如应用程序已经运行)而失败,您可能会收到此错误。在这种情况下,只需执行“清理项目”,然后“重建项目”,然后“运行”即可部署。

于 2008-10-07T08:13:15.287 回答
4

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

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

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

于 2012-05-17T00:59:08.877 回答
1

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

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

于 2012-06-06T21:00:41.097 回答
0

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

于 2008-10-07T07:38:05.530 回答
0

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

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

这当然是在您使用 Visual Studio 的情况下。

于 2008-10-08T08:33:33.140 回答
0

消息 undefined reference to `vtable for MyDialog' 也可能是 MyDialog 派生的类中的纯虚函数缺少实现(在 MyDialog 中)的结果。

于 2013-03-11T04:20:20.790 回答