我与以下非常简单的应用程序有奇怪的链接问题,该应用程序有一个继承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 ++类,它就可以正常工作。
可能出现什么问题?