Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Can't find linker symbol for virtual table
Qt 6.11 is out! See what's new in the release blog

Can't find linker symbol for virtual table

Scheduled Pinned Locked Moved Solved General and Desktop
20 Posts 6 Posters 4.5k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • wojjW wojj

    Hello,
    I have a very simple class hierarchy in my example, which generates can't find linker symbol for virtual table warning in gdb. I do not understand why.
    Main:

    #include <QApplication>
    
    #include "classa.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        ClassA *pA = new ClassA();
    
        return a.exec();
    }
    

    ClassA

    #ifndef CLASSA_H
    #define CLASSA_H
    
    #include <QObject>
    
    #include "classb.h"
    #include "classc.h"
    #include "classd.h"
    #include "classe.h"
    #include "classf.h"
    
    class ClassA : public QObject
    {
        Q_OBJECT
    public:
        explicit ClassA(QObject *parent = nullptr);
    
    private:
        ClassB *pB;
        ClassC *pC;
        ClassD *pD;
        ClassE *pE;
        ClassF *pF;
    
    signals:
    
    public slots:
    };
    
    #endif // CLASSA_H
    

    ClassB, C, D, E and F looks exactly the same so only B below

    #ifndef CLASSB_H
    #define CLASSB_H
    
    #include <QObject>
    
    class ClassB : public QObject
    {
        Q_OBJECT
    public:
        explicit ClassB(QObject *parent = nullptr);
    
    signals:
    
    public slots:
    };
    
    #endif // CLASSB_H
    

    and class A cpp

    #include "classa.h"
    
    ClassA::ClassA(QObject *parent) : QObject(parent)
    {
        pB = new ClassB();
        pC = new ClassC();
        pD = new ClassD();
        pE = new ClassE();
        pF = new ClassF();
    }
    

    Now when I set a breakpoint in line 5 in ClassA.cpp press 11 (step into) I get warning from gdb. The same from other classes.
    Can enybody give me a hint where is the problem?
    Best regards

    kshegunovK Offline
    kshegunovK Offline
    kshegunov
    Moderators
    wrote on last edited by kshegunov
    #3

    Is this the code that really generates the error or some stripped down version? You can get this if you overrun the buffer and overwrite the virtual table, or you have some sort of mismatch between library/executable when linking.

    Read and abide by the Qt Code of Conduct

    1 Reply Last reply
    2
    • wojjW Offline
      wojjW Offline
      wojj
      wrote on last edited by
      #4

      Hi,
      This is exactly this code. Cleaning, deleting build directory doesn't help.
      @kshegunov do you know how to check if there is some mismatch?

      kshegunovK 1 Reply Last reply
      0
      • wojjW wojj

        Hi,
        This is exactly this code. Cleaning, deleting build directory doesn't help.
        @kshegunov do you know how to check if there is some mismatch?

        kshegunovK Offline
        kshegunovK Offline
        kshegunov
        Moderators
        wrote on last edited by
        #5

        @wojj said in Can't find linker symbol for virtual table:

        @kshegunov do you know how to check if there is some mismatch?

        Let's start by clarifying if this whole code is in one binary (i.e. one executable) or is split over more than one binary (i.e. one executable and one library)?

        Read and abide by the Qt Code of Conduct

        1 Reply Last reply
        0
        • wojjW Offline
          wojjW Offline
          wojj
          wrote on last edited by
          #6

          There is one executable file.

          kshegunovK 1 Reply Last reply
          0
          • wojjW wojj

            There is one executable file.

            kshegunovK Offline
            kshegunovK Offline
            kshegunov
            Moderators
            wrote on last edited by
            #7

            Then that point is moot. Try initializing the members with an initializer list, the message may be a red herring after all. That is, something like this:

            ClassA::ClassA(QObject * parent)
                : QObject(parent), pB(new ClassB()), pC(new ClassC()), pD(new ClassD()), pE(new ClassE()), pF(new ClassF())
            {
            }
            

            Read and abide by the Qt Code of Conduct

            wojjW 1 Reply Last reply
            3
            • kshegunovK kshegunov

              Then that point is moot. Try initializing the members with an initializer list, the message may be a red herring after all. That is, something like this:

              ClassA::ClassA(QObject * parent)
                  : QObject(parent), pB(new ClassB()), pC(new ClassC()), pD(new ClassD()), pE(new ClassE()), pF(new ClassF())
              {
              }
              
              wojjW Offline
              wojjW Offline
              wojj
              wrote on last edited by
              #8

              @kshegunov Didn't help. Still the same warning.

              kshegunovK 1 Reply Last reply
              0
              • wojjW wojj

                @kshegunov Didn't help. Still the same warning.

                kshegunovK Offline
                kshegunovK Offline
                kshegunov
                Moderators
                wrote on last edited by
                #9

                Then the only other thing I can think of is the vtable not being emitted due to a missing definition of a non-inline function (constructor) in one of the classes. Aside from that I have no clue.

                Read and abide by the Qt Code of Conduct

                wojjW 1 Reply Last reply
                0
                • kshegunovK kshegunov

                  Then the only other thing I can think of is the vtable not being emitted due to a missing definition of a non-inline function (constructor) in one of the classes. Aside from that I have no clue.

                  wojjW Offline
                  wojjW Offline
                  wojj
                  wrote on last edited by
                  #10

                  @kshegunov I ran ldd for this application and it looks there is missing one libraby
                  linux-vdso.so.1 => (0x00007ffeae25a000)

                  1 Reply Last reply
                  0
                  • ? Offline
                    ? Offline
                    A Former User
                    wrote on last edited by
                    #11

                    @wojj can you upload code somewhere so we can try to reproduce that issue?

                    wojjW 1 Reply Last reply
                    0
                    • ? A Former User

                      @wojj can you upload code somewhere so we can try to reproduce that issue?

                      wojjW Offline
                      wojjW Offline
                      wojj
                      wrote on last edited by
                      #12

                      @casdevel All code is in my first post. It's very simple example.

                      1 Reply Last reply
                      0
                      • mranger90M Offline
                        mranger90M Offline
                        mranger90
                        wrote on last edited by
                        #13

                        We need to see one of [b,c,d,e].cpp, where is the constructor ?

                        wojjW 1 Reply Last reply
                        0
                        • mranger90M mranger90

                          We need to see one of [b,c,d,e].cpp, where is the constructor ?

                          wojjW Offline
                          wojjW Offline
                          wojj
                          wrote on last edited by
                          #14

                          @mranger90 Constructors are empty. All for ClassB,C,D,E,F looks the same

                          ClassB::ClassB(QObject *parent) : QObject(parent)
                          {
                          
                          }
                          
                          1 Reply Last reply
                          0
                          • ? Offline
                            ? Offline
                            A Former User
                            wrote on last edited by
                            #15

                            @wojj

                            All code is in my first post. It's very simple example.

                            It's part of the code, not all. Maybe example is simple but problem is obviously not, otherwise it would already be solved.
                            I think your best bet for solving this would be to upload complete project.

                            wojjW 1 Reply Last reply
                            0
                            • ? A Former User

                              @wojj

                              All code is in my first post. It's very simple example.

                              It's part of the code, not all. Maybe example is simple but problem is obviously not, otherwise it would already be solved.
                              I think your best bet for solving this would be to upload complete project.

                              wojjW Offline
                              wojjW Offline
                              wojj
                              wrote on last edited by
                              #16

                              @casdevel All code below. In my first post I described how to get gdb warning.
                              Main

                              #include <QApplication>
                              
                              #include "classa.h"
                              
                              int main(int argc, char *argv[])
                              {
                                  QApplication a(argc, argv);
                                  ClassA *pA = new ClassA();
                              
                                  return a.exec();
                              }
                              

                              H files

                              #ifndef CLASSA_H
                              #define CLASSA_H
                              
                              #include <QObject>
                              
                              #include "classb.h"
                              #include "classc.h"
                              #include "classd.h"
                              #include "classe.h"
                              #include "classf.h"
                              
                              class ClassA : public QObject
                              {
                                  Q_OBJECT
                              
                              public:
                                  explicit ClassA(QObject *parent = nullptr);
                                  ~ClassA();
                              
                              private:
                                  ClassB *pB;
                                  ClassC *pC;
                                  ClassD *pD;
                                  ClassE *pE;
                                  ClassF *pF;
                              
                              
                              
                              signals:
                              
                              public slots:
                              };
                              
                              #endif // CLASSA_H
                              
                              
                              
                              #ifndef CLASSB_H
                              #define CLASSB_H
                              
                              #include <QObject>
                              
                              class ClassB : public QObject
                              {
                                  Q_OBJECT
                              
                              public:
                                  explicit ClassB(QObject *parent = nullptr);
                                  ~ClassB();
                              
                              signals:
                              
                              public slots:
                              };
                              
                              #endif // CLASSB_H
                              
                              
                              
                              
                              #ifndef CLASSC_H
                              #define CLASSC_H
                              
                              #include <QObject>
                              
                              class ClassC : public QObject
                              {
                                  Q_OBJECT
                              
                              public:
                                  explicit ClassC(QObject *parent = nullptr);
                                  ~ClassC();
                              
                              signals:
                              
                              public slots:
                              };
                              
                              #endif // CLASSC_H
                              
                              
                              
                              
                              
                              #ifndef CLASSD_H
                              #define CLASSD_H
                              
                              #include <QObject>
                              
                              class ClassD : public QObject
                              {
                                  Q_OBJECT
                              
                              public:
                                  explicit ClassD(QObject *parent = nullptr);
                                  ~ClassD();
                              
                              signals:
                              
                              public slots:
                              };
                              
                              #endif // CLASSD_H
                              
                              
                              
                              
                              #ifndef CLASSE_H
                              #define CLASSE_H
                              
                              #include <QObject>
                              
                              class ClassE : public QObject
                              {
                                  Q_OBJECT
                              
                              public:
                                  explicit ClassE(QObject *parent = nullptr);
                                  ~ClassE();
                              
                              signals:
                              
                              public slots:
                              };
                              
                              #endif // CLASSE_H
                              
                              
                              
                              
                              #ifndef CLASSF_H
                              #define CLASSF_H
                              
                              #include <QObject>
                              
                              class ClassF : public QObject
                              {
                                  Q_OBJECT
                              
                              public:
                                  explicit ClassF(QObject *parent = nullptr);
                                  ~ClassF();
                              
                              signals:
                              
                              public slots:
                              };
                              
                              #endif // CLASSF_H
                              
                              

                              cpp files

                              #include "classa.h"
                              
                              ClassA::ClassA(QObject *parent) : QObject(parent), pB(nullptr), pC(nullptr), pD(nullptr), pE(nullptr), pF(nullptr)
                              {
                                  pB = new ClassB();
                                  pC = new ClassC();
                                  pD = new ClassD();
                                  pE = new ClassE();
                                  pF = new ClassF();
                              }
                              
                              ClassA::~ClassA()
                              {
                              
                              }
                              
                              
                              #include "classb.h"
                              
                              ClassB::ClassB(QObject *parent) : QObject(parent)
                              {
                              
                              }
                              
                              ClassB::~ClassB()
                              {
                              
                              }
                              
                              
                              
                              #include "classc.h"
                              
                              ClassC::ClassC(QObject *parent) : QObject(parent)
                              {
                              
                              }
                              
                              ClassC::~ClassC()
                              {
                              
                              }
                              
                              
                              
                              #include "classd.h"
                              
                              ClassD::ClassD(QObject *parent) : QObject(parent)
                              {
                              
                              }
                              
                              ClassD::~ClassD()
                              {
                              
                              }
                              
                              
                              
                              #include "classe.h"
                              
                              ClassE::ClassE(QObject *parent) : QObject(parent)
                              {
                              
                              }
                              
                              ClassE::~ClassE()
                              {
                              
                              }
                              
                              
                              
                              #include "classf.h"
                              
                              ClassF::ClassF(QObject *parent) : QObject(parent)
                              {
                              
                              }
                              
                              ClassF::~ClassF()
                              {
                              
                              }
                              
                              
                              1 Reply Last reply
                              0
                              • wojjW Offline
                                wojjW Offline
                                wojj
                                wrote on last edited by
                                #17

                                And .pro file

                                #-------------------------------------------------
                                #
                                # Project created by QtCreator 2018-02-09T17:35:19
                                #
                                #-------------------------------------------------
                                
                                QT       += core gui
                                
                                greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
                                
                                TARGET = Test
                                TEMPLATE = app
                                
                                # The following define makes your compiler emit warnings if you use
                                # any feature of Qt which has been marked as deprecated (the exact warnings
                                # depend on your compiler). Please consult the documentation of the
                                # deprecated API in order to know how to port your code away from it.
                                #DEFINES += QT_DEPRECATED_WARNINGS
                                
                                # You can also make your code fail to compile if you use deprecated APIs.
                                # In order to do so, uncomment the following line.
                                # You can also select to disable deprecated APIs only up to a certain version of Qt.
                                #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
                                
                                
                                SOURCES += \
                                        main.cpp \
                                    classa.cpp \
                                    classb.cpp \
                                    classc.cpp \
                                    classd.cpp \
                                    classe.cpp \
                                    classf.cpp
                                
                                HEADERS += \
                                    classa.h \
                                    classb.h \
                                    classc.h \
                                    classd.h \
                                    classe.h \
                                    classf.h
                                
                                
                                1 Reply Last reply
                                1
                                • ? Offline
                                  ? Offline
                                  A Former User
                                  wrote on last edited by
                                  #18

                                  OK, I get the same warning as you if I use Qt 5.10.0, but with older Qt 5.5.1 there is no warning. I didn't investigate why since
                                  app is running fine and debugging also working correctly (apart from that warning) with both Qt versions.

                                  I think that you can safely ignore this warning since everything is working correctly.

                                  jsulmJ 1 Reply Last reply
                                  3
                                  • ? A Former User

                                    OK, I get the same warning as you if I use Qt 5.10.0, but with older Qt 5.5.1 there is no warning. I didn't investigate why since
                                    app is running fine and debugging also working correctly (apart from that warning) with both Qt versions.

                                    I think that you can safely ignore this warning since everything is working correctly.

                                    jsulmJ Offline
                                    jsulmJ Offline
                                    jsulm
                                    Lifetime Qt Champion
                                    wrote on last edited by jsulm
                                    #19

                                    @casdevel @wojj Would be worth to file a bug report to get rid of this warning.
                                    And sometimes warnings actually point to real issues :-)

                                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                                    1 Reply Last reply
                                    2
                                    • wojjW Offline
                                      wojjW Offline
                                      wojj
                                      wrote on last edited by
                                      #20

                                      Thank you for help. The problem seems to be related to Qt version in that case.
                                      Best regards.

                                      1 Reply Last reply
                                      0

                                      • Login

                                      • Login or register to search.
                                      • First post
                                        Last post
                                      0
                                      • Categories
                                      • Recent
                                      • Tags
                                      • Popular
                                      • Users
                                      • Groups
                                      • Search
                                      • Get Qt Extensions
                                      • Unsolved