我正在开发一个简单的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 ,但是它们编译好了。我找不到他们和破碎的人之间的任何差异。

在破碎的课堂上肯定会遗漏一些东西,但我无法发现它。

有帮助吗?

解决方案

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

其他提示

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

  1. 右键单击已添加此项目的项目。
  2. 点击'Run qmake'。
  3. 这将清除旧的引用并使用Q_OBJECT宏构建。 QT在重建时没有这样做。

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

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

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

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

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

当然,如果你使用的是Visual Studio,那当然就是这样。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top