Qt metaObject链接器问题

时间:2011-07-10 17:56:37

标签: c++ visual-studio-2010 qt

将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)    

该怎么办?

8 个答案:

答案 0 :(得分:17)

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

要让Qt项目在VS中运行,你可以

  1. 使用'qmake -tp vc'或
  2. 创建.vcproj文件
  3. 使用Qt Visual Studio外接程序自动处理所有moc魔法(但不适用于VC Express版本)。
  4. 使用加载项时,您可以通过

    触发创建moc_foo.cpp
    • 确保相关对象的头文件出现在VS项目
    • 列表项
    • 从Multiplication_dialog的头文件中删除Q_OBJECT的所有出现。
    • 保存文件
    • 再次添加Q_OBJECT
    • 保存文件

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

答案 1 :(得分:14)

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

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

因此,如果有人再次遇到同样的问题(或者造成相同的副本和错误): 确保标题文件也已添加到项目文件中

答案 2 :(得分:6)

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

答案 3 :(得分:4)

那么今天我遇到了同样的问题。我知道线程很老了。但它可能仍然可以帮助某人。

在我的案例中发生了什么moc正在生成moc_ .cpp文件但VC不知道它也必须编译它们。所以我手动添加了那些moc生成的文件,以便编译。它工作。

答案 4 :(得分:2)

我目前正在使用带有QT 5.4插件的VS 2013。使用加载项构建项目可以更轻松地自动处理moc。为了防止Qt元对象问题的链接器错误问题:

  1. 在类声明中包含它的所有头文件中注释掉所有Q_OBJECT实例。

  2. 构建解决方案

  3. 取消注释头文件中所有Q_OBJECT实例。

  4. 重建解决方案。这是所有所有头文件和cpp文件都被重新编译的地方,moc'ing自动完成。链接器错误依次被处理。

答案 5 :(得分:1)

当我使用Qt Addin for VS时出现同样的问题,我在构建之后看到了moc文件are not included into project。我将它们包含在项目中这些错误消失了。

答案 6 :(得分:0)

尝试重新启动项目的 .pro

答案 7 :(得分:0)

上面有些相当冗长的解释。
在菜单栏上使用Qt Creator:
构建>运行qmake
Build>全部构建