undefined reference to vtable for …

前端 未结 4 1410
余生分开走
余生分开走 2021-01-13 03:42

I am trying to write an Http proxy that basically works like indianwebproxy

So i fired up qtcreator and but one of my classes is failing to compile with the infamous

相关标签:
4条回答
  • 2021-01-13 03:52

    The destructor is implicitly virtual because a base class has a virtual d'tor.

    The GNU compiler emits the vtable along with the first non-inline virtual method ("key method"). As your d'tor is defined inside the class, it is implicitly virtual, and as there are no other virtual methods, you don't have a key method.

    There is no use case where a concrete class would have only virtual inline methods, as they can be inlined only into derived classes.

    I'd move the definition of the dtor to the implementation file.

    I'm not sure whether you need to use moc here as well, or if QThread derivatives work without (IIRC you need it only for Qt's cast operators, and for signals/slots).

    0 讨论(0)
  • 2021-01-13 03:58

    You can't copy QTcpSockets, so it may cause other cryptic errors if you try to pass them by copy rather than by address.

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

    And completely recompiling your project may help, when you change header files, because qmake generated Makefile can sometimes fail to notice the changes.

    0 讨论(0)
  • 2021-01-13 04:07

    I had also a undefined reference to vtable error and followed the steps in Undefined reference to vtable... Q_OBJECT macro, that adviced me to run qmake and... it worked!

    0 讨论(0)
  • 2021-01-13 04:14

    This is often caused by not linking the files generated by automoc.

    First, you need to run automoc on the headers where classes using Q_OBJECT are defined, in your case "httpproxythreadbrowser.h". This will generate a "*.moc" file.

    Now there are two common approaches how to continue. Either you can #include the .moc file at the end of your .cpp file with class definition or you can pass it to the compiler as anoher source file.

    0 讨论(0)
提交回复
热议问题