Solved undefined reference to `vtable for shutdown'
-
I am working on a project using Qt 4.8.4, the revision of Qt is something I have no control over. I have added a class one of the libraries which are built with cmake, here is the prototype:
shutdown.h:
#ifndef SHUTDOWN_H #define SHUTDOWN_H #include <QApplication> #include <QDesktopWidget> #include <QMainWindow> namespace Ui { class shutdown; } class shutdown : public QMainWindow { Q_OBJECT public: explicit shutdown(const char* cpszText, QWidget* pParent = 0); ~shutdown(); private: Ui::shutdown* ui; }; #endif // SHUTDOWN_H
#include "shutdown.h" #include "ui_shutdown.h" shutdown::shutdown(const char* cpszText, QWidget* pParent) : QMainWindow(pParent), ui(new Ui::shutdown) { ui->setupUi(this); if ( cpszText ) { ui->plblText->setText(cpszText); } } shutdown::~shutdown() { delete ui; }
I've checked CMakeLists.txt which includes the CC file, however when build completes I get:
../../(shutdown.cc.o): In function `shutdown::shutdown(char const*, QWidget*)': shutdown.cc: (.text+0x3a): undefined reference to `vtable for shutdown' shutdown.cc: (.text+0x41): undefined reference to `vtable for shutdown' ../../(shutdown.cc.o): In function `shutdown::~shutdown()': shutdown.cc: (.text+0x4cd): undefined reference to `vtable for shutdown' shutdown.cc: (.text+0x4d4): undefined reference to `vtable for shutdown' collect2: ld returned 1 exit status make[2]: *** [file name] Error 1 make[2] Leaving directory 'location' make[1] ** [filename.dir/all] Error 2 make[1] Leaving directory 'location' make: *** [all] Error 2
-
I finally found and fixed the issue, which turned out to be not code related at all. The problem was in the CMakeLists.txt file, the build structure here is over complicated and there were two instances of the same file in a slightly different folder structure, unfortunately I had been editing the wrong file, having realised this and moved onto the correct file, everything is now A ok!
-
@SPlatten
First do a complete, utter rebuild --- i.e. delete all the previously generated object files --- and see whether still an issue.... -
@JonB , done, many times:
make clean cmake ${variable} make
-
delete all the previously generated
clean is not infallible, actually delete the shadow build folder.
-
@J-Hilk , how do I do that?
-
@SPlatten selected it in the file explorer of your choice, and press delete on your keyboard
-
@J-Hilk , thank you, how do I identify its where abouts?
-
@SPlatten if you're using QtCreator, in the project settings tab, its usually parallel to your source folder
-
@J-Hilk , unfortunately not, the build process is entirely using cmake. I've just renamed the build folder and then started off the build again with a new build folder, all the object files were in subfolders of the build folder.
-
@SPlatten said in undefined reference to `vtable for shutdown':
@J-Hilk , unfortunately not, the build process is entirely using cmake.
qmake or cmake make no difference here, build directory is what you're looking for
-
@J-Hilk , build just completed in new folder with exactly the same results.
-
@SPlatten ok, one point less to check, very unusual
ok, try adding
virtual
to your destructor declaration.did you post the whole class?
are there any other functions, virtual or not, in there? -
@J-Hilk . that was the entire class, I've added virtual to the destructor prototype, rebuilding now.
-
@J-Hilk, Exactly the same results.
-
@SPlatten did you make changes in your CMakeLists.txt ?
I assume you have
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set (CMAKE_INCLUDE_CURRENT_DIR ON)in it ?
and
set(PROJECT_SOURCES ....)contains your new class ?
as well as
qt5_wrap_cppqt4_wrap_cpp() (I think that was needed for older version ?) -
@J-Hilk , I've added the set calls from your post to the make file, the qt4 bits that I did have:
find_package(Qt4 REQUIRED) include(${QT_USE_FILE}) foreach(loop_var ${QT_LIBRARIES}) string(REPLACE lib64 lib32 loop_var ${loop_var}) set(QT_LIBRARIES_32 ${QT_LIBRARIES_32} ${loop_var}) endforeach(loop_var) qt4_wrap_ui(UI_HEADERS ${FORMS}) qt4_wrap_cpp(MOC_SRCS ${HEADERS})
-
@J-Hilk , Unfortunately, still the same result.
-
@SPlatten Well,
I'm sorry to say it, but I'm out of ideas. My experience with cmake is very limited and does not reach further :(
-
@J-Hilk , thanks for your time and efforts.
-
@SPlatten in your source dir where cmake file is located do the following:
mkdir build
cd build
cmake .. -Dyour settings
make -j4Try to build your code in the build folder all the time. In case you have your vtable issues, simply rm -rf * to delete everything in build dir and redo cmake. Do this only in build dir. Be very careful with rm -rf *. You have to have svn or git for your sources.