我正在开发一个简单的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
的子类,但是它们编译好了。我找不到他们和破碎的人之间的任何差异。
在破碎的课堂上肯定会遗漏一些东西,但我无法发现它。
答案 0 :(得分:34)
由于没有moc文件,导致对“vtable for MyDialog”的未定义引用。大多数c ++编译器在包含第一个虚函数的目标文件中创建vtable定义。当子类化qt对象并使用Q_OBJECT宏时,它将在moc * .cpp文件中。因此,此错误意味着缺少moc文件。
我能想到的可能问题是:
类myDialog.h的头文件未添加到qmake文件中的HEADERS。
您在添加Q_OBJECT宏之前运行了qmake以生成make文件。这创建了一个没有moc规则的make文件。只需再次运行qmake即可轻松解决此问题。
您的对话框派生自多个类,而QDialog不是它派生的第一个类。为了使qmake正常工作,QObject派生的基类需要是继承自的第一个类。
如果您使用的是Qt Creator,如果您之前的部署由于某种原因(例如应用程序已在运行)而失败,则可能会出现此错误。在这种情况下,只需执行“清理项目”,然后执行“重建项目”,然后执行“运行”即可部署。
答案 1 :(得分:3)
如果您有头文件,请按照以下步骤操作:
这将清除旧的引用并使用Q_OBJECT宏构建。 QT在重建时没有这样做。
答案 2 :(得分:1)
我看到只有在添加没有扩展名的类时才出现问题,然后手动添加扩展名。
要解决问题,我将Q_OBJECT放在班级的.h中,然后右键点击“来源” - > “添加现有文件...”选择我修改过的类的.ccp。
答案 3 :(得分:0)
你在使用qmake吗?也许您没有将它的.cpp文件添加到您的SOURCES和.h文件到qmake文件中的HEADERS变量?
答案 4 :(得分:0)
我谦卑地建议您使用CMake在Windows上构建Qt程序。它会让你记住在其构建文件中添加适当的文件。
附加值是您可以从中生成make / nmake构建文件,即Visual Studio解决方案文件。如果您从Visual Studio的源代码编译Qt,您将能够使用MS IDE /编译器进行编码和构建。
当然,如果你使用的是Visual Studio,那当然就是这样。
答案 5 :(得分:0)
对于'vtable for MyDialog'的消息未定义引用也可能是MyDialog派生的类中纯虚函数缺少实现(在MyDialog中)的结果。