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

时间:2017-09-18 07:38:22

标签: c++ qt

我与以下非常简单的应用程序有奇怪的链接问题,该应用程序有一个继承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();
}

这会导致以下错误:

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

我显然已经尝试过运行qmake,清理并重建而没有效果。如果我通过删除所有Qt引用使类Foo成为普通的C ++类,它就可以正常工作。

可能出现什么问题?

0 个答案:

没有答案