C++ Qt元对象链接器问题

C++ Qt元对象链接器问题,c++,visual-studio-2010,qt,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@

在将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_对象标记的类)未在项目中编译/链接时,通常会出现这些错误

要使Qt项目在VS中工作

  • 使用“qmake-tp vc”或
  • 使用Qt-visualstudio插件,它会自动为您处理所有的moc魔术(但不适用于VC-Express版本)
  • 使用外接程序时,您可以通过以下方式触发moc_foo.cpp的创建:

    • 确保相关对象的头文件出现在VS项目中
    • 列表项
    • 从乘法对话框的头文件中删除Q_对象的所有出现
    • 保存文件
    • 再次添加Q_对象
    • 保存文件
    现在,在解决方案资源管理器的“生成的文件”文件夹中应该有两个版本的moc_multiplication_dialog.cpp。一个用于“调试”,一个用于“发布”。 确保这些文件中的一个未从构建中排除。

    引用《使用Qt 4进行C++GUI编程》(第19页):为了使moc正常工作,我们必须将类定义放在头文件中,与实现文件分开。
    因此,您需要为您的类编写两个文件:Multiplication\u dialog.h和Multiplication\u dialog.cpp!您必须重新创建makefile

    今天我可能遇到了同样的问题。我知道这根线很旧了。但它仍然可以帮助某些人


    我的情况是
    moc
    正在生成
    moc.cpp
    文件,但VC不知道它也必须编译它们。所以我手动添加了那些moc生成的文件,以便进行编译。它成功了

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

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

    因此,如果任何人再次遇到相同的问题(或犯了相同的复制错误):
    确保头文件也已添加到您的项目文件中

    当我将Qt Addin用于VS时发生了相同的问题,我看到moc文件
    在生成后未包含在项目中。我把它们包括在项目中,这些错误都消失了

    我目前正在使用VS 2013和QT 5.4插件。使用外接程序构建项目会更容易,因为moc’ing是自动处理的。要防止Qt元对象问题的链接器错误问题,请执行以下操作:

  • 注释掉类声明中包含Q_对象的所有头文件中Q_对象的所有实例

  • 构建解决方案

  • 取消注释头文件中Q_对象的所有实例

  • 重建解决方案。这是所有头文件和cpp文件重新编译的地方,moc’ing自动完成。链接器错误将依次得到处理


  • 尝试重新启动项目的.pro

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

    Build>Build All

    #Job或我正在使用qt addin(我希望这就是您所说的vs addin)检查您的vsproj中是否包含moc\u multiply\u dialog.cpp。如果错过了,@jobor是对的)是的,我指的是Qt插件。问题是您的类乘法对话框有一个Q_对象宏,但没有创建或编译moc_乘法对话框.cpp(我只能猜测文件名)。为什么有必要这样做?因为VS的一些错误配置阻止了moc文件的使用。有时,即使它正确地生成moc文件,但由于没有包含这些文件,它的行为就像它不存在一样。最后将其包含在源文件中?如果VS没有处理它,则需要一些东西。这也是使用cmake时的一个良好做法。如果您使用IDE不可知,它将适用于任何构建系统。QtCreator附带的一些示例包括项目中的.moc文件。所以结论是,虽然包含头文件似乎更正确,但包含moc文件是完全有效的。从一本暂时为我工作的书中获得信息真的很有帮助。谢谢我将看看它是否能在应用程序继续构建时保持不变。这不仅适用于.cpp,也适用于.H。我们定义了一个纯抽象作为我们定义的接口,但它有一个非虚拟信号。这意味着.h必须在源代码中,才能在CMakeLists.txt文件中编译,因此它将是moc'd。