在将 Qt 与 Vs 集成并尝试编译 .pro 文件后,我收到以下错误:
Error 9 error LNK2001: unresolved external symbol "public: virtual int __thiscall Multiplication_dialog::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Multiplication_dialog@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
Error 7 error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Multiplication_dialog::metaObject(void)const " (?metaObject@Multiplication_dialog@@UBEPBUQMetaObject@@XZ)
Error 8 error LNK2001: unresolved external symbol "public: virtual void * __thiscall Multiplication_dialog::qt_metacast(char const *)" (?qt_metacast@Multiplication_dialog@@UAEPAXPBD@Z)
这个怎么办?
当 foo.h 的 moc_foo.cpp(包含用 Q_OBJECT 标记的类)未在您的项目中编译/链接时,您通常会遇到这些错误。
要使 Qt 项目在 VS 中工作,您要么
使用插件时,您可以触发 moc_foo.cpp 的创建
现在您应该在解决方案资源管理器的“生成的文件”文件夹中有两个版本的 moc_multiplication_dialog.cpp。一份用于“调试”,一份用于“发布”。 确保这些文件之一是 not 从构建中排除。
我今天遇到了同样的链接器错误,但这是由于一个小错误:
我手动将cpp/ui文件添加到我的项目中,但忘记将头文件显式添加为头文件。现在,在编译时,我收到了与上述类似的错误消息,并且未在构建的调试(或发布)目录中生成 moc_*.cpp 文件。 这不是一个明显的错误,qmake 没有抱怨,除了链接器消息,我没有收到任何错误。
所以如果有人再次遇到同样的问题(或犯同样的复制和粘贴错误): 确保头文件也已添加到您的项目文件中
引自《C++ GUI Programming with Qt 4》一书(第 19 页):为了使 moc 正常工作,我们必须将类定义放在头文件中,与实现文件分开。 所以,你需要为你的类编写 2 个文件:Multiplication_dialog.h 和 Multiplication_dialog.cpp!你必须重新创建 makefile!
今天我可能遇到了同样的问题。我知道线程很旧。但它仍然可以帮助某人。
在我的案例中发生的事情是
moc
正在生成 moc_ .cpp
文件,但 VC 不知道它也必须编译它们。所以我手动添加了那些 moc 生成的文件,以便它编译。它奏效了。
我目前正在使用带有 QT 5.4 插件的 VS 2013。使用加载项构建项目更容易,因为移动是自动处理的。为了防止 Qt 元对象问题的链接器错误问题:
在类声明中包含它的所有头文件中注释掉 Q_OBJECT 的所有实例。
构建解决方案
在头文件中取消注释 Q_OBJECT 的所有实例。
重建解决方案。这是所有头文件和 cpp 文件都重新编译并自动完成 moc 的地方。链接器错误依次得到处理。
当我使用 Qt Addin for VS 时出现同样的问题,我在构建后看到了 moc 文件
are not included into project
。我将它们包含在项目中,这些错误消失了。
尝试重新启动项目的.pro。
上面的一些相当冗长的解释。
使用Qt Creator,在菜单栏上:
构建>运行 qmake
构建>全部构建
我刚刚有一个案例“我如何在一个带有 Q_OBJECT 的类中创建一个具有可变数量参数的方法?[重复]”当我在头文件的类定义中有一个 Q_OBJECT 时我有链接器错误;但是一些违规函数的主体位于 .cpp 文件中。我将主体移动到头文件中的类定义,问题就消失了。无需对 moc_ 文件执行任何特殊操作。同一个类中的另一个函数的主体在 .cpp 文件中做得很好。