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

say*_*aee 67 c++ qt qobject

我从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应用程序的文件夹并再次运行它以更正此问题.

  • 从类中删除Q_OBJECT宏,在使用VS 2012的QT5插件时保存并添加Q_OBJECT再次为我工作 (17认同)
  • 我有同样的问题.删除调试文件夹没有帮助.还有什么想法吗? (7认同)
  • 我对一个课程项目有同样的问题.我发现删除`Q_OBJECT`宏平直解决了我的问题.不知道为什么.但是,如果我把它放回去,我会收到相同的3个未解决的错误.我通过在QT的`.pro`文件和我正在使用的`cmakelists.txt`文件中包含新类来修复该问题.一旦我包含了头文件和cpp文件,代码就可以使用`QObject`. (5认同)
  • @Vern Jensen,检查`Q_OBJECT`宏,然后重建,然后删除debug/release文件夹(删除所有moc文件)并重新重建.其中一个应该有所帮助. (2认同)

小智 60

如果您使用的是Visual Studio,请Q_OBJECT从头文件中删除该行,保存文件,放Q_OBJECT回头文件,再次保存文件.这应该生成moc_*文件,并应正确构建和链接.

  • 没有其他解决方案适合我,但这样做了!谢谢!;) (3认同)
  • 如果您正在使用CMake,请确保您已设置`(CMAKE_AUTOMOC ON) (3认同)
  • 这个答案也应该被视为一个有效的答案! (2认同)
  • 为我炒菜(VS2017),谢谢。用注释掉的“Q_OBJECT”编译,如果恢复则不编译。不会激发对 Qt 的信心。我认为“Q_OBJECT”宏是必要的? (2认同)

Ste*_*uan 31

我注意到一些答案基于Visual Studio.

这个答案基于Qt Creator.

与名称建议不同,Rebuild Project不会消除所有内容并从头开始构建.如果您最近添加QObject(和/或Q_OBJECT)到您的班级,您将不得不qmake再次运行,例如

  1. 清洁项目
  2. 运行qmake
  3. 建设项目

这是因为,默认情况下,qmake只有在对解决方案进行重大更改(如添加新源文件或修改.pro文件)时才会运行.如果您对现有文件进行了编辑,则它不知道它需要运行qmake.

作为后退,蛮力Qt从头开始构建一切,删除DebugRelease文件夹.


Ver*_*sen 10

所以问题是我需要Qt MOC编译器来编译我的.h文件.对于任何扩展QObject或其子项之一的类,都需要这样做.修复了(对我来说)修复程序右键单击头文件,选择属性,并将项类型设置为"Qt MOC输入",然后在标题上点击"编译",然后将生成的moc_myfilename.cpp文件添加到我的项目.

  • 为我工作,除了类型是“自定义构建工具”而不是“Qt MOC 输入”。我正在使用 Visual Studio 2017。 (2认同)
  • 在 VS 2019 上,它被称为“Qt 元对象编译器(moc)”,当我更改它时,它对我有用。 (2认同)

Akı*_*maz 7

如果您的moc文件是在visual studio项目中生成的,如果它们未包含在项目中,则尝试将它们包含到项目中,然后重建.


Vin*_*san 6

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

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


Tre*_*key 6

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

  1. 在解决方案资源管理器中右键单击头文件
  2. 属性
  3. 将"项目类型"更改为"自定义生成工具"

然后在自定义构建工具配置中:

  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 $(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插件应用.


Edw*_*ard 5

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

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