我从QObject继承了一个类:
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;
}
};
Run Code Online (Sandbox Code Playgroud)
但是当我写道:
Parent ev;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
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)
Run Code Online (Sandbox Code Playgroud)
say*_*aee 69
您应该删除debug
应用程序的文件夹并再次运行它以更正此问题.
小智 60
如果您使用的是Visual Studio,请Q_OBJECT
从头文件中删除该行,保存文件,放Q_OBJECT
回头文件,再次保存文件.这应该生成moc_*
文件,并应正确构建和链接.
Ste*_*uan 31
我注意到一些答案基于Visual Studio.
这个答案基于Qt Creator.
与名称建议不同,Rebuild Project
不会消除所有内容并从头开始构建.如果您最近添加QObject
(和/或Q_OBJECT)到您的班级,您将不得不qmake
再次运行,例如
这是因为,默认情况下,qmake
只有在对解决方案进行重大更改(如添加新源文件或修改.pro
文件)时才会运行.如果您对现有文件进行了编辑,则它不知道它需要运行qmake
.
作为后退,蛮力Qt从头开始构建一切,删除Debug
或Release
文件夹.
Ver*_*sen 10
所以问题是我需要Qt MOC编译器来编译我的.h文件.对于任何扩展QObject或其子项之一的类,都需要这样做.修复了(对我来说)修复程序右键单击头文件,选择属性,并将项类型设置为"Qt MOC输入",然后在标题上点击"编译",然后将生成的moc_myfilename.cpp文件添加到我的项目.
我手动将 cpp/ui 文件添加到我的项目中,但忘记将头文件显式添加为头文件。现在,在编译时,我收到了与上述类似的错误消息,并且在构建的调试(或发布)目录中未生成 moc_*.cpp 文件。这不是一个明显的错误,qmake 没有抱怨,除了链接器消息之外,我没有任何错误。
因此,如果有人再次遇到同样的问题(或犯了同样的复制和粘贴错误):确保头文件也已添加到您的项目文件中
我在Visual Studio中遇到了同样的问题,并通过以下步骤解决了这个问题:
然后在自定义构建工具配置中:
将"命令行"设置为:
"$(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 $(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插件应用.
当我的 cpp 文件中有 Q_OBJECT 类定义时,我在 Visual Studio 2012 中遇到了这个问题。将类定义移动到头文件解决了这个问题。
看起来应该可以通过将 cpp 文件添加到 moc 来支持 cpp 文件中的 Q_OBJECT 类,但我没有尝试过。