【问题标题】:undefined reference to vtable for ...未定义的对 vtable 的引用...
【发布时间】:2012-03-09 13:55:37
【问题描述】:

我正在尝试编写一个基本上像 indianwebproxy 一样工作的 Http 代理

所以我启动了 qtcreator,但我的一个类因臭名昭著的错误无法编译:undefined reference to vtable for HttpProxyThreadBrowser。我不明白它为什么这样做。我阅读了有关 Stackoverflow 的类似问题,显然 the problem is with undefined virtual methods that are not pure 但我没有声明任何虚函数。这是我的课

class HttpProxyThreadBrowser : public QThread
{
public:
    HttpProxyThreadBrowser(QTcpSocket outgoingSocket,QTcpSocket  browserSocket,QObject *parent = 0);
    ~HttpProxyThreadBrowser(){};
    void run();

private:
    QTcpSocket outgoingSocket;
    QTcpSocket browserSocket;

};

我在pastebin 中定义了这个类,以免让你感到厌烦。不幸的是,我无法找出 vtable 未定义的原因。请帮忙。

httpproxythreadbrowser.cpp:5: undefined reference to `vtable for HttpProxyThreadBrowser
collect2: ld returned 1 exit status

【问题讨论】:

  • 根据documentation,run 是一个受保护的成员,而不是公共的。不过,我怀疑这会是您错误的根源。
  • @obmarg:是的,因为 run 是虚拟的,他从未定义过。
  • 嗯...我编译得很好。 MinGw 上的 4.7.4 + 4.8.0。您使用的是哪个操作系统/Qt 版本?
  • 对于通过 google 来到这里的任何人:我们收到此错误是因为 .pro 文件中有多余的空格
  • @stativ 的回答虽然在这种情况下不正确,但在使用 Qt 时却是导致此错误消息的一个非常常见的原因。如果您添加了一个新的 QObject 派生类,但忘记将其添加到 HEADERS 变量(或以其他方式运行 moc 并与结果对象链接),这准确地是看到的错误消息。对于很多人偶然发现这个问题,这将是问题的原因......

标签: c++ qt linker-errors vtable


【解决方案1】:

析构函数隐式为virtual,因为基类有一个virtual d'tor。

GNU 编译器与第一个非内联虚拟方法(“关键方法”)一起发出 vtable。由于您的 d'tor 是在类中定义的,因此它是隐式虚拟的,并且由于没有其他虚拟方法,因此您没有关键方法。

不存在具体类只有虚拟内联方法的用例,因为它们只能内联到派生类中。

我会将 dtor 的定义移到实现文件中。

我不确定您是否也需要在这里使用moc,或者如果没有QThread 派生类也可以工作(IIRC 你只需要Qt 的强制转换运算符和信号/槽)。

【讨论】:

    【解决方案2】:

    我也遇到了undefined reference to vtable 错误,并按照Undefined reference to vtable... Q_OBJECT macro 中的步骤操作,建议我运行qmake 并且...它成功了!

    【讨论】:

    • 谢谢!你救了我的命!
    【解决方案3】:

    您无法复制QTcpSockets,因此如果您尝试通过复制而不是地址传递它们,可能会导致其他神秘错误。

        HttpProxyThreadBrowser(QTcpSocket * outgoingSocket,QTcpSocket * browserSocket,QObject *parent = 0);
    
    private:
        QTcpSocket* outgoingSocket;
        QTcpSocket* browserSocket;
    

    当您更改头文件时,完全重新编译您的项目可能会有所帮助,因为 qmake 生成的 Makefile 有时可能无法注意到更改。

    【讨论】:

    • 另一种解决方案是通过引用传递QTcpSocket,即HttpProxyThreadBrowser(QTcpSocket & outboundSocket,QTcpSocket & browserSocket,QObject *parent = 0);
    • 非常感谢大家。但这让我想知道为什么我不能复制 QTcpSockets 但那是另一天的故事。
    【解决方案4】:

    这通常是由于没有链接 automoc 生成的文件造成的。

    首先,您需要在定义了使用 Q_OBJECT 的类的标头上运行 automoc,在您的情况下为“httpproxythreadbrowser.h”。这将生成一个“*.moc”文件。

    现在有两种常见的方法可以继续。您可以在带有类定义的 .cpp 文件末尾 #include .moc 文件,也可以将其作为另一个源文件传递给编译器。

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多