无法parsing的外部符号“public:virtual struct QMetaObject const * __thiscall Parent

我从QObjectinheritance了一个类:

class Parent: public QObject { Q_OBJECT QObject* cl; public: Parent(QObject *parent=0):QObject(parent) { cl = NULL; } QObject* getCl() const { return cl; } void setCl(QObject *obj) { cl = obj; } }; 

但是当我写:

 Parent ev; 

我得到以下错误:

 main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Parent::metaObject(void)const " (?metaObject@Parent@@UBEPBUQMetaObject@@XZ) main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual void * __thiscall Parent::qt_metacast(char const *)" (?qt_metacast@Parent@@UAEPAXPBD@Z) main.obj:-1: error: LNK2001: unresolved external symbol "public: virtual int __thiscall Parent::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Parent@@UAEHW4Call@QMetaObject@@HPAPAX@Z) 

您应该删除应用程序的debug文件夹,然后再次运行以解决此问题。

如果使用Visual Studio,请从头文件中删除行Q_OBJECT ,保存文件,将Q_OBJECT放回到头文件中,再次保存文件。 这应该生成moc_*文件,并应该正确地build立和链接。

如果你最近添加了QObject到你的类,你将不得不再次运行qmake ,即

  1. 清洁项目
  2. 运行qmake
  3. build立项目

否则,如果你正在对一个最近改变了它的QObjectinheritance的类进行增量构build,那么你将会有失效的moc *文件。

其他人build议删除您的debugging文件夹。 这也是删除过时的moc *文件的另一种方法。

如果您的moc文件是在Visual Studio项目中生成的,请尝试将它们包含到项目中,如果它们没有包含在项目中,那么重build。

所以问题是我需要Qt MOC编译器来编译我的.h文件。 这是扩展QObject或其子项的所有类所必需的。 该修补程序(对我来说)右键单击头文件,select属性,并将项目types设置为“Qt MOCinput”,然后在头上点击“编译”,然后将生成的moc_myfilename.cpp文件添加到我的项目。

我在Visual Studio中遇到了同样的问题,并通过以下步骤解决了这个问题:

  1. 在解决scheme资源pipe理器中右击头文件
  2. 属性
  3. 将“项目types”更改为“自定义生成工具”

然后在Custom Build Toolconfiguration中:

  1. 去一般
  2. 设置“命令行”为:

    “$(QTDIR)\ bin \ moc.exe”“%(FullPath)”-o“。\ GeneratedFiles \ $(ConfigurationName)\ moc _%(Filename).cpp”“-fStdAfx.h”“-f ../ ../../src/ FileName.h “-DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DWIN32_LEAN_AND_MEAN -DDIS_VERSION = 7 -D_MATH_DEFINES_DEFINED”-I。\ SFML_STATIC“”-I 。\ GeneratedFiles“”-I“ “-I $(QTDIR)\ include”“-I。\ GeneratedFiles \ $(ConfigurationName)”。 “-I $(QTDIR)\ include \ QtCore”“-I $(QTDIR)\ include \ QtGui”“-I $(QTDIR)\ include \ QtNetwork”

  3. 设置“输出”为:

    \ GeneratedFiles \ $(ConfigurationName)\ MOC _%(文件名)的.cpp

  4. 设置“附加依赖”来:
    $(QTDIR)\ BIN \ moc.exe;%(FULLPATH)


您的确切值可能会有所不同。 他们通常通过Qt插件来应用。

我使用CMake来pipe理Qt项目,并且需要在QT4_WRAP_CPP调用下添加新的Q_OBJECT。 这将生成moc _ *。cxx以包含在项目中,并清理未parsing的外部数据。

在我的情况下(使用VS2012和Qt v4.8.4使用QtAdd-in)上述build议没有工作。 由于某些原因,VS无法生成适当的moc文件(构build输出:找不到相关的类,没有生成输出),当我手工编译相关头文件(将qt moc设置为编译器并单击“编译”)时, 。

所做的工作是从命令行编译所有必要的moc(moc -o moc_SomeClass.cpp SomeClass.h),然后replaceGeneratedFiles文件夹中的错误。

这只是一个解决方法(对于一个大项目来说不是一个方便的工具)能够成功地构build项目,但并不能真正解释奇怪的VS / QtAdd-in行为。

在VS2010中使用QtAdd-in后,我意识到moc _ *。cpp文件在GeneratedFiles / Debug文件夹中已经更新,尽pipe我处于发布模式。 将文件复制到发布文件夹为我工作。

当我在cpp文件中有一个Q_OBJECT类定义时,我遇到了Visual Studio 2012的这个问题。 将类定义移动到头文件解决了问题。

看起来应该可以通过将cpp文件添加到moc来支持cpp文件中的Q_OBJECT类,但是我没有尝试这个。

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

所以,如果有人再次遇到相同的问题(或使相同的副本和PASE错误): 确保头文件也被添加到您的项目文件

我有一个“私人class”的问题。 Qt使用这个模型,虽然他们的代码。 我自己真的很喜欢它。

基本上,在公共头文件类定义中有一个私有声明的类,其中有一个指向它的实例的指针,作为公共类的数据成员。 (注意:你可能会发现生活更容易宣布为朋友class。)

然后,在公共文件的cpp文件中创build你的类的私有版本。 不要为这个私人类创build一个头文件。 做那个class的所有肮脏的工作。 这隐藏了您的公开课的所有实施,包括其他私人成员。

在没有进一步解释的情况下,下面是关于这个线程的一点。 要获得Q_OBJECT的工作,我需要添加到cpp:

 #include "MyPublicClass.moc" 

cpp布局如下所示:

  1. 私人类被定义
  2. 公共课的moc是#included。
  3. 然后定义公共类的实现。

最近从MingW切换到MSVC时发生在我身上。 我有一个原型class/结构列为一类,MingW不介意。

当涉及原型时,MSVC肯定会看到classstruct之间的区别。

希望有一天能帮助别人。

在我的情况下,以上都没有工作,但这完全是我的错误。

我已经在.h文件(声明他们)overrided虚函数,但从来没有在.cpp中定义它们:)

我通过添加到我的头文件解决了我的问题:

 #ifndef MYCLASSNAME_H #define MYCLASSNAME_H ... // all the header file content. #endif 

答案在VS 2013环境中适用于我。 我最终通过从项目中删除.h / .cpp并将其添加回来来解决问题。

我在一个集成的Perforce p4v客户端在VS2015工作。 在我的情况下,Perforce尝试将moc文件添加到depo,当我恢复这个操作时,Perforce从项目中删除了这个moc文件并将其删除。 该文件是在下一次编译后重新创build的,但没有包含在项目中,我不得不手动添加到生成的文件,当我终于明白是什么问题。