Qt metaObject链接器问题

sma*_*llB 19 c++ qt visual-studio-2010

在将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)    
Run Code Online (Sandbox Code Playgroud)

怎么办?

小智 17

当您的项目中没有编译/链接foo.h的moc_foo.cpp(包含标有Q_OBJECT的类)时,您通常会收到这些错误.

要让Qt项目在VS中工作,你要么

  1. 使用'qmake -tp vc'创建.vcproj文件
  2. 使用Qt Visual Studio外接程序自动处理所有moc魔法(但不适用于VC Express版本).

使用加载项时,可以触发创建moc_foo.cpp

  • 确保有问题的对象的头文件出现在VS项目中
  • 项目清单
  • 从Multiplication_dialog的头文件中删除Q_OBJECT的所有出现.
  • 保存文件
  • 再次添加Q_OBJECT
  • 保存文件

现在,您应该在解决方案资源管理器的"生成的文件"文件夹中有两个版本的moc_multiplication_dialog.cpp.一个用于"调试",一个用于"释放".确保从构建中排除其中一个文件.


mic*_*l_s 15

我今天遇到了相同的链接器错误,但这是由于一个小滑:

我手动将cpp/ui文件添加到我的项目中,但忘记将头文件显式添加为头文件.现在编译时我收到了类似的错误信息,并且在构建的调试(或发布)目录中没有生成moc _*.cpp文件.这不是一个明显的错误,qmake没有抱怨,除了链接器消息我没有错误.

因此,如果任何人再次遇到相同的问题(或使相同的副本和错误): 确保头文件也已添加到您的项目文件


小智 6

Citate来自"使用Qt 4进行C++ GUI编程"(第19页):要使moc正常工作,我们必须将类定义放在头文件中,与实现文件分开.因此,您需要为您的类编写2个文件:Multiplication_dialog.h和Multiplication_dialog.cpp!你必须重新创建makefile!