Why am I getting "undefined reference to vtable..." errors when linking this Qt 5.0 application?

11,874

Solution 1

Turns out I forgot:

set(CMAKE_AUTOMOC ON)

At the top of the CMakeLists.txt file.

Solution 2

I struggled with this for a long time using all the hints published here:

http://doc.qt.io/qt-5/cmake-manual.html

And here

https://www.kdab.com/using-cmake-with-qt-5/

What I had to do was specify things in the right order. For example, the following is the top of my CMakeLists.txt. Note that the two CMAKE set directives come before add_executable. Once I did this, I was able to link without undefined symbols and vtable references. I just thought I'd post this for the benefit of others.

cmake_minimum_required (VERSION 2.8)

set (CMAKE_AUTOMOC ON)
set (CMAKE_INCLUDE_CURRENT_DIR ON)
add_executable(FHSpectrumSensor wideband_seq_spectrum_sensor.cpp sensor.cpp   gui.cpp ${gui_SRC})

Later in the CMakeLists.txt I have the following:

 find_package(Qt5Widgets REQUIRED)
 find_package(Qt5Charts REQUIRED)
 find_package(Qt5Core REQUIRED)

 qt5_use_modules(FHSpectrumSensor Widgets Charts)
 qt5_wrap_cpp(gui_SRC gui.h gui.cpp)

That did the trick.

Solution 3

I also ran into this problem yesterday and the above mentioned answers did't help. I already used set (CMAKE_AUTOMOC ON) and also qt5_wrap_cpp.

I tried to remember what I did, because I had a working version but it stopped working after "some" changes. I finally remembered that I tried to split the include files into a separate directory hierarchy. After reverting that and putting the include files back into the CMakeLists.txt it worked again. I sure don't know why, and I would like to know what went wrong, but I settled now for keeping the includes near the cpp files.

set(SOURCES
    buffer.h
    ITVSet.h
    MainWindow.h
    MainWindow.cpp
    TVSet.h
    TVSet.cpp
)
Share:
11,874
Nathan Osman
Author by

Nathan Osman

Email: [email protected] By profession, I am a software developer and I work with C++, Python, and (more recently) Go. Here are some of my recent projects: - Hectane - lightweight SMTP server written in Go - NitroShare - a cross-platform network file transfer utility - REST Easy - Firefox add-on for analyzing HTTP responses

Updated on June 03, 2022

Comments

  • Nathan Osman
    Nathan Osman almost 2 years

    I've got a relatively simple Qt 5.0 project that uses CMake 2.8.9:

    CMakeLists.txt:

    cmake_minimum_required(VERSION 2.8.9)
    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    project(hello-world)
    
    find_package(Qt5Widgets REQUIRED)
    qt5_wrap_ui(hello-world_UI MainWindow.ui)
    
    add_executable(hello-world MainWindow.cpp main.cpp ${hello-world_UI})
    qt5_use_modules(hello-world Widgets)
    

    MainWindow.h:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    namespace Ui {
        class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
        public:
    
            MainWindow();
            virtual ~MainWindow();
    
        private:
    
            Ui::MainWindow * const ui;
    };
    
    #endif // CMAINWINDOW_H
    

    MainWindow.cpp:

    #include "MainWindow.h"
    #include "ui_MainWindow.h"
    
    MainWindow::MainWindow()
        : ui(new Ui::MainWindow)
    {
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    

    main.cpp:

    #include <QApplication>
    #include "MainWindow.h"
    
    int main(int argc, char * argv[])
    {
        QApplication app(argc, argv);
    
        MainWindow win;
        win.show();
    
        return app.exec();
    }
    

    The project also includes a .ui file created with Qt Creator 2.6.1 (MainWindow.ui).

    When I attempt to build the file with g++ on Linux, I receive the following errors:

    CMakeFiles/hello-world.dir/MainWindow.cpp.o: In function `MainWindow::MainWindow()':
    MainWindow.cpp:(.text+0x3b): undefined reference to `vtable for MainWindow'
    MainWindow.cpp:(.text+0x4d): undefined reference to `vtable for MainWindow'
    CMakeFiles/hello-world.dir/MainWindow.cpp.o: In function `MainWindow::~MainWindow()':
    MainWindow.cpp:(.text+0xaf): undefined reference to `vtable for MainWindow'
    MainWindow.cpp:(.text+0xc1): undefined reference to `vtable for MainWindow'
    collect2: error: ld returned 1 exit status
    

    What could possibly be causing this sort of error? I recently switched to CMake from qmake and I never remember running into this much trouble getting a trivial example to compile. What am I doing wrong?


    Edit: here is the command being used to link everything:

    /usr/bin/c++ CMakeFiles/hello-world.dir/MainWindow.cpp.o
    CMakeFiles/hello-world.dir/main.cpp.o -o hello-world -rdynamic
    /usr/local/Qt-5.0.0/lib/libQt5Widgets.so.5.0.0
    /usr/local/Qt-5.0.0/lib/libQt5Gui.so.5.0.0
    /usr/local/Qt-5.0.0/lib/libQt5Core.so.5.0.0 
    -Wl,-rpath,/usr/local/Qt-5.0.0/lib