未解决的外部符号 "public: virtual struct QMetaObject const * __thiscall Parent

88

我从 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;
    }
};

但是当我写:

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)

编辑.vcxproj文件对我有效...检查所有的.h或.hh文件是否在QtMoc标签中:<QtMoc Include="main_app.h" />;其他事情我已经检查过了。 - lRadha
27个回答

0

在VS 2013环境中,两种答案对我都可以。最终,我通过从项目中删除.h/.cpp并将其重新添加来解决了问题。


0
在我的情况下,以上的方法都没有起作用,但这完全是我的错误。
我在.h文件中重写了虚函数(声明了它们),但从未在.cpp文件中定义它们 :)

0

我有同样的问题,我的解决方案是编码(我的文件使用“UTF16LE BOM”无法生成moc.exe),我创建了另一个使用ASCII编码的文件,它可以工作。

HxD HexEditor可以帮助您查看编码。


0
对我来说,这是原因:QT项目文件中没有包含某些头文件或源文件。

0
在我的情况下,我有一个有问题的QObject祖先的.h和.cpp文件位于项目的子文件夹中。当我将它们移动到CMakeLists.txt(项目根文件夹)旁边时,链接成功了。我可能错过了一些CMake命令来包括子目录中的文件的mocs。

0

在Qt Creator中

事实证明,我之所以出现这个错误是因为我在.h文件中后来添加了Q_OBJECT。

在将文件从项目中删除并重新添加后,我成功地解决了它。

愉快的编码...


-1
我通过将以下内容添加到我的头文件中解决了我的问题:
#ifndef MYCLASSNAME_H
#define MYCLASSNAME_H

... // all the header file content.

#endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接