当从QObject继承的类具有虚函数时,会导致链接错误。

4

以下是能正常工作的代码

class HttpService {
public:
    virtual ~HttpService(); // implemented in .cpp
protected:
    HttpService(struct MHD_Connection *conn) {}
};
class HttpFileService : public HttpService
{
public:
    virtual ~HttpFileService() ; // implemented in .cpp
protected:
    HttpFileService(struct MHD_Connection *conn) : HttpService(conn) {}
};

现在,当我将HttpService作为QObject的派生类,如下所示:
#include <QObject>                      // change #1
class HttpService  : public QObject {   // change #2
    Q_OBJECT                            // change #3
public:
    virtual ~HttpService();
protected:
    HttpService(struct MHD_Connection *conn) {}
};

class HttpFileService : public HttpService {
    Q_OBJECT                            // change #4
public:
    virtual ~HttpFileService() ;
protected:
    HttpFileService(struct MHD_Connection *conn) : HttpService(conn) {}
};

我遇到了以下链接错误:

Undefined symbols for architecture x86_64:
  "vtable for HttpService", referenced from:
      HttpService::~HttpService()in httpservice.o

HttpService的构造函数更改为以下内容也没有帮助。
explicit HttpService(QObject *parent = 0) : QObject(parent)

1
代码更改后,~HttpService().cpp 文件中是否仍有实现?我之所以问这个问题是因为在更改后的代码中,我没有看到 // implemented in .cpp 这样的注释。 - iammilind
@iammilind,是的,它仍然是。唯一更改的行已在注释中突出显示。 - S B
2
这是 HttpService() 的全部内容吗?如果我在抽象基类中声明了一个虚函数并忘记将其定义为纯虚函数,那么我经常会看到这个错误。(如果声明了一个非纯、非内联虚函数,并且如果gcc在同一对象文件中生成vtable,那么如果该函数没有定义,则它将缺失)。 - Mike Seymour
1
@mike-seymour,说得好!这确实不是整个类,但我仔细检查了一下,你所说的似乎在这里并不是问题。另外,在从QObject派生之前,为什么代码不会崩溃呢? - S B
3个回答

10

尝试强制运行qmake,并查看其是否正常工作。


1
你是否链接到了正确的Qt库?

是的,我的项目中还有其他派生自QObject的类,它们都正常运行。 - S B

0
你是否在调用 moc-compiler?如果没有,请删除 Q_OBJECT 宏!并且你是否包含/链接了 moc 编译的结果?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接