C++ 在Qt对象中使用接口类会导致链接器错误LNK2001
我在下面这个非常简单的应用程序中遇到了奇怪的链接问题,它有一个继承QObject和接口类的类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
#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
不会真正运行此文件并生成所需的附加代码。更好的是,将classFoo
的声明移动到一个单独的头文件中,并将其添加到.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