无法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
,即
- 清洁项目
- 运行qmake
- build立项目
否则,如果你正在对一个最近改变了它的QObjectinheritance的类进行增量构build,那么你将会有失效的moc *文件。
其他人build议删除您的debugging文件夹。 这也是删除过时的moc *文件的另一种方法。
如果您的moc文件是在Visual Studio项目中生成的,请尝试将它们包含到项目中,如果它们没有包含在项目中,那么重build。
所以问题是我需要Qt MOC编译器来编译我的.h文件。 这是扩展QObject或其子项的所有类所必需的。 该修补程序(对我来说)右键单击头文件,select属性,并将项目types设置为“Qt MOCinput”,然后在头上点击“编译”,然后将生成的moc_myfilename.cpp文件添加到我的项目。
我在Visual Studio中遇到了同样的问题,并通过以下步骤解决了这个问题:
- 在解决scheme资源pipe理器中右击头文件
- 属性
- 将“项目types”更改为“自定义生成工具”
然后在Custom Build Toolconfiguration中:
- 去一般
-
设置“命令行”为:
“$(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”
-
设置“输出”为:
\ GeneratedFiles \ $(ConfigurationName)\ MOC _%(文件名)的.cpp
-
设置“附加依赖”来:
$(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布局如下所示:
- 私人类被定义
- 公共课的moc是#included。
- 然后定义公共类的实现。
最近从MingW切换到MSVC时发生在我身上。 我有一个原型class/结构列为一类,MingW不介意。
当涉及原型时,MSVC肯定会看到class
和struct
之间的区别。
希望有一天能帮助别人。
在我的情况下,以上都没有工作,但这完全是我的错误。
我已经在.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的,但没有包含在项目中,我不得不手动添加到生成的文件,当我终于明白是什么问题。