Why am I getting "undefined reference to vtable..." errors when linking this Qt 5.0 application?
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
)
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, 2022Comments
-
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