Qt 元对象链接器问题

问题描述 投票:0回答:9

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

这个怎么办?

c++ visual-studio-2010 qt
9个回答
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。一份用于“调试”,一份用于“发布”。 确保这些文件之一是 not 从构建中排除。


17
投票

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

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

所以如果有人再次遇到同样的问题(或犯同样的复制和粘贴错误): 确保头文件也已添加到您的项目文件中


6
投票

引自《C++ GUI Programming with Qt 4》一书(第 19 页):为了使 moc 正常工作,我们必须将类定义放在头文件中,与实现文件分开。 所以,你需要为你的类编写 2 个文件:Multiplication_dialog.h 和 Multiplication_dialog.cpp!你必须重新创建 makefile!


4
投票

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

在我的案例中发生的事情是

moc
正在生成
moc_   .cpp
文件,但 VC 不知道它也必须编译它们。所以我手动添加了那些 moc 生成的文件,以便它编译。它奏效了。


3
投票

我目前正在使用带有 QT 5.4 插件的 VS 2013。使用加载项构建项目更容易,因为移动是自动处理的。为了防止 Qt 元对象问题的链接器错误问题:

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

  2. 构建解决方案

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

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


1
投票

当我使用 Qt Addin for VS 时出现同样的问题,我在构建后看到了 moc 文件

are not included into project
。我将它们包含在项目中,这些错误消失了。


0
投票

尝试重新启动项目的.pro


0
投票

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


0
投票

我刚刚有一个案例“我如何在一个带有 Q_OBJECT 的类中创建一个具有可变数量参数的方法?[重复]”当我在头文件的类定义中有一个 Q_OBJECT 时我有链接器错误;但是一些违规函数的主体位于 .cpp 文件中。我将主体移动到头文件中的类定义,问题就消失了。无需对 moc_ 文件执行任何特殊操作。同一个类中的另一个函数的主体在 .cpp 文件中做得很好。

© www.soinside.com 2019 - 2024. All rights reserved.