undefined reference to `vtable for shutdown'
-
@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.
-
@SPlatten
Wellmake -j4
isn't going to fix anything :)Your code looks right to me (especially the
Q_OBJECT
, whose absence/change can often cause this). Given that you say you have cleaned everything out and rebuilt I am not sure what is wrong (unless there is some artefact left around somewhere it is still seeing).From the linker messages
undefined reference to vtable for 'shutdown'
I am unsure whether it is talking about yourclass shutdown : public QMainWindow {
or the Qt-Designer-generatednamespace Ui { class shutdown; }
(Ui::shutdown
). You might just check what is in the generatedui_shutdown.h
file to see if it looks good.... (and if that has not been being regenerated, delete it or update the.ui
file to make it regenerate, just in case).@JonB , thank you, here is ui_shutdown.h:
#ifndef UI_SHUTDOWN_H #define UI_SHUTDOWN_H #include <QtCore/QVariant> #include <QtGui/QAction> #include <QtGui/QApplication> #include <QtGui/QButtonGroup> #include <QtGui/QHeaderView> #inlcude <QtGui/QLabel> #include <QtGui/QMainWindow> #include <QtGui/QWidget> QT_BEGIN_NAMESPACE class Ui_shutdown { public: QWidget *centralWidget; QLabel *plblText; void setupUi(QMainWindow *shutdown) { if ( shutdown->objectName().isEmpty()) shutdown->setObjectName(QString::fromUtf8("shutdown")); shutdown->resize(171, 73); shutdown->setStyleSheet(QString::fromUtf8("background-color: #0790ff;\n" "color:#ffffff;\n" "")); centralWidget = new QWidget(shutdown); centralWidget->setObjectName(QString::fromUtf8("centralWidget")); plblText = new QLabel(centralWidget); plblText->setObjectName(QString::fromUtf8("plblText")); plblText->setGeometry(QRect(0, 0, 171, 71)); plblText->setStyleSheet(QString::fromUtf8("vertical-align:middle;\n" "text-align: center;\n" "font-weight: bold;\n" "")); plblText->setAlignment(Qt::AlignCenter); shutdown->setCentralWidget(centralWidget); retranslateUi(shutdown); QMetaObject::connectSlotsByName(shutdown); } // setupUi void retranslateUi(QMainWindow *shutdown) { shutdown->setWindowTitle(QString()); plblText->setText(QApplication::translate("shutdown", "Shutting down...", 0, QApplication::UnicodeUTF8)); } // retranslateUi }; namespace Ui { class shutdown: public Ui_shutdown {}; } // namespace Ui QT_END_NAMESPACE #endif // UI_SHUTDOWN_H
-
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
@SPlatten said in undefined reference to `vtable for shutdown':
../../(shutdown.cc.o): In function `shutdown::shutdown(char const*, QWidget*)':
Note that this
.o
file is being found in../..
from where you are/the compiler is being run. Is that indeed correct for you, and where you have deleting files from? Do you by any chance have any othershutdown.cc.o
file lying around anywhere from, say, the whole of../..
downward?I have no experience of " I have added a class one of the libraries which are built with cmake". But when you do a complete rebuild I am expecting you to see among the commands:
- A
uic
run on onshutdown.ui
, producingui_shutdown.h
. - A
cc
(or whatever) compilation run onshutdown.cc
, producingshutdown.o
. - A
cc
onmoc_shotdown.cc
, or similar, producing <can't recall>. - Some kind of
ld
(or maybecc
) doing the linking. It will involveshutdown.cc.o
, I can't remember how moc works, whether there is amoc_shutdown.cc.o
or just themoc_shutdown.h
or whatever source file.
This is not for you to paste the whole output here, it's for you to look at just to verify. It ought be correct anyway.
- A
-
@SPlatten ~shutdown() has to be virtual. It is better to start with upper case in your class name(Shutdown). Normally function starts with lower case.
also make sure shutdown.cpp is added to cmake fileexplicit shutdown(const char* cpszText, QWidget* pParent = 0); virtual ~shutdown();
-
@SPlatten ~shutdown() has to be virtual. It is better to start with upper case in your class name(Shutdown). Normally function starts with lower case.
also make sure shutdown.cpp is added to cmake fileexplicit shutdown(const char* cpszText, QWidget* pParent = 0); virtual ~shutdown();
@SPlatten said in undefined reference to `vtable for shutdown':
@J-Hilk . that was the entire class, I've added virtual to the destructor prototype, rebuilding now.
@SPlatten
Let's be clear: you are now compiling withpublic: explicit shutdown(const char* cpszText, QWidget* pParent = 0); virtual ~shutdown();
right?
-
@SPlatten said in undefined reference to `vtable for shutdown':
@J-Hilk . that was the entire class, I've added virtual to the destructor prototype, rebuilding now.
@SPlatten
Let's be clear: you are now compiling withpublic: explicit shutdown(const char* cpszText, QWidget* pParent = 0); virtual ~shutdown();
right?
-
@SPlatten said in undefined reference to `vtable for shutdown':
../../(shutdown.cc.o): In function `shutdown::shutdown(char const*, QWidget*)':
Note that this
.o
file is being found in../..
from where you are/the compiler is being run. Is that indeed correct for you, and where you have deleting files from? Do you by any chance have any othershutdown.cc.o
file lying around anywhere from, say, the whole of../..
downward?I have no experience of " I have added a class one of the libraries which are built with cmake". But when you do a complete rebuild I am expecting you to see among the commands:
- A
uic
run on onshutdown.ui
, producingui_shutdown.h
. - A
cc
(or whatever) compilation run onshutdown.cc
, producingshutdown.o
. - A
cc
onmoc_shotdown.cc
, or similar, producing <can't recall>. - Some kind of
ld
(or maybecc
) doing the linking. It will involveshutdown.cc.o
, I can't remember how moc works, whether there is amoc_shutdown.cc.o
or just themoc_shutdown.h
or whatever source file.
This is not for you to paste the whole output here, it's for you to look at just to verify. It ought be correct anyway.
- A
-
@SPlatten said in undefined reference to `vtable for shutdown':
@J-Hilk . that was the entire class, I've added virtual to the destructor prototype, rebuilding now.
@SPlatten
Let's be clear: you are now compiling withpublic: explicit shutdown(const char* cpszText, QWidget* pParent = 0); virtual ~shutdown();
right?
-
@JonB , I've changed these prototypes several times with the same result each time, presently they are:
public: shutdown(const char* cpszText, QWidget *pParent = 0); ~shutdown();
-
@JonB , the only place the shutdown.cc.o exists is off the build directory which I am still deleting completely between rebuilds.
@SPlatten
I am lost at this point. It might be that one of the experts knows better than I what situation you are in. You would have to wait for them to see this, perhaps later.At this point, if I were you and I had nothing else to do I would probably take what you have and put it into a brand new, from scratch, standalone tiny project (maybe get rid of the
.ui
file too) and see if I could get it working as (a) a standalone Qt program (provide amain()
) and (b) whatever you are doing for " I have added a class [to] one of the libraries" which I don't know about.public: shutdown(const char* cpszText, QWidget *pParent = 0); ~shutdown();
I do think you should write
virtual ~shutdown();
here, just in case. -
@SPlatten this is wrong. You have always to have virtual in front of a destructor. Otherwise, you may have unpleasant memory leak in your apps.
-
@SPlatten
I am lost at this point. It might be that one of the experts knows better than I what situation you are in. You would have to wait for them to see this, perhaps later.At this point, if I were you and I had nothing else to do I would probably take what you have and put it into a brand new, from scratch, standalone tiny project (maybe get rid of the
.ui
file too) and see if I could get it working as (a) a standalone Qt program (provide amain()
) and (b) whatever you are doing for " I have added a class [to] one of the libraries" which I don't know about.public: shutdown(const char* cpszText, QWidget *pParent = 0); ~shutdown();
I do think you should write
virtual ~shutdown();
here, just in case. -
Just for completeness, here is the actual content of the CMakeLists.txt file:
cmake_minimum_required(VERSION 2.8.10) include (flexelint) set (CMAKE_AUTOUIC ON) set (CMAKE_AUTOMOC ON) set (CMAKE_AUTORCC ON) set (CMAKE_INCLUDE_CURRENT_DIR ON) set (FORMS shutdown_ui) set (HEADERS shutdown.h ui_shutdown.h) set (sources shutdown.cc) set (output vip_backend) add_library(${output} STATIC ${sources}) 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}) target_link_libraries(${output} ${QT_LIBRARIES_32}) add_flint(${output})
I have no idea what flexelint is or what it does, same is true of add_flint(${output}).
-
@JoeCFD , ok, I've changed the constructor so it is prefixed with explicit and the destructor with virtual which goes back to how it was and I still have the same issue.
-
@SPlatten forget about Qt Creator. Try to build it from command line
Delete build folder
Create build folder
From build folder cmake ${myvariable}
From build folder make VERBOSE=1
add verbose to see more build details. -
@JoeCFD , that is exactly all I am doing. Also cmake is version 2.8.10.2
rm -R build mkdir build cd build cmake ${myvariable} make
In the CMakeLists.txt file I have:
set (CMAKE_VERBOSE_MAKEFILE ON)
-
@JoeCFD , that is exactly all I am doing. Also cmake is version 2.8.10.2
rm -R build mkdir build cd build cmake ${myvariable} make
In the CMakeLists.txt file I have:
set (CMAKE_VERBOSE_MAKEFILE ON)
-
@SPlatten As Jon commented, you can comment the destructor code out and build. It is a small leak. Not a big deal. shutdown is not a good name for class. Try to avoid to use any system command names as your class names. Name it for example ShutdownWindow.