C++ 在Qt对象中使用接口类会导致链接器错误LNK2001

C++ 在Qt对象中使用接口类会导致链接器错误LNK2001,c++,qt,C++,Qt,我在下面这个非常简单的应用程序中遇到了奇怪的链接问题,它有一个继承QObject和接口类的类 #include <QApplication> #include <memory> #include <iostream> #include <qobject> class IFoo { public: virtual ~IFoo() {} virtual void foo()=0; }; class Foo: public QObje

我在下面这个非常简单的应用程序中遇到了奇怪的链接问题,它有一个继承QObject和接口类的类

#include <QApplication>
#include <memory>
#include <iostream>
#include <qobject>

class IFoo {
public:
    virtual ~IFoo() {}
    virtual void foo()=0;
};

class Foo: public QObject, public IFoo
{
    Q_OBJECT
public:
    explicit Foo(QObject *parent=0): QObject(parent) { std::cout << "foo ctor" << std::endl; }
    void foo() override { std::cout << "foo::foo" << std::endl; }
};

std::unique_ptr<IFoo> createFoo() { return std::unique_ptr<IFoo>(new Foo()); }

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    auto foo = createFoo();
    return a.exec();
}
我显然试过运行qmake、清理和重建,但没有效果。如果我通过删除所有的Qt引用使类为FO一个纯C++类,则它工作正常。
可能有什么问题?

如果您的项目使用标准的Qt的“.pro”文件,请将此处显示的文件添加到“HEADERS”变量中。如果没有这一点,
qmake
不会真正运行此文件并生成所需的附加代码。更好的是,将class
Foo
的声明移动到一个单独的头文件中,并将其添加到
.pro
文件中的
HEADERS
变量中。这是将所有内容放在一个文件中时出现的常见问题。您必须为每个QObject类创建单独的头文件和源文件。这就是我一直以来解决这个问题的方法。Qt由于它的MOC生成器而偏离了标准C++。不是DUP,但可能有一些帮助:生成额外文件(S),它们也需要被编译/链接。问题确实通过将所有的东西分离到它们自己的头文件和实现文件(如我原先所做的,但为了简化而做)来解决。该问题最初是由驻留在类Foo(Foo.cpp)的实现文件中的createFoo()引起的,将其移动到自己的头文件中修复了该问题。谢谢
LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __cdecl Foo::metaObject(void)const " (?metaObject@Foo@@UEBAPEBUQMetaObject@@XZ)
LNK2001: unresolved external symbol "public: virtual void * __cdecl Foo::qt_metacast(char const *)" (?qt_metacast@Foo@@UEAAPEAXPEBD@Z)
LNK2001: unresolved external symbol "public: virtual int __cdecl Foo::qt_metacall(enum QMetaObject::Call,int,void * *)" qt_metacall@Foo@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)
LNK1120: 3 unresolved externals