I've tried unsuccessfully to correct the error.
Any help would be appreciated.
After correcting another compilation bug the source code compiles to 100% but then throws an undefined reference to vtable error listed below.
Searching online for "undefined reference for vtable" returns various results.
This error appears linked with:
- compilation error by QMake and CMake (sometimes fixed by re-running make command)
- missing destructor
- Q_Object declarations made in .cpp files
- Q macros in .cpp files
Project:
https://github.com/a-ilin/vidalia
Compiler:
- CMake
Compilation Error:
[ 98%] Building CXX object src/vidalia/CMakeFiles/vidalia.dir/vidalia_autogen/PNK5WDWK6L/qrc_vidalia.cpp.o
[ 98%] Building CXX object src/vidalia/CMakeFiles/vidalia.dir/vidalia_autogen/ZY6QLEUMHC/qrc_content.cpp.o
[100%] Building CXX object src/vidalia/CMakeFiles/vidalia.dir/vidalia_autogen/O3VI4VFR3H/qrc_vidalia_i18n.cpp.o
[100%] Linking CXX executable vidalia
/usr/bin/ld: CMakeFiles/vidalia.dir/Vidalia.cpp.o: in functionVidaliaNativeEventFilter::VidaliaNativeEventFilter()': Vidalia.cpp:(.text._ZN24VidaliaNativeEventFilterC2Ev[_ZN24VidaliaNativeEventFilterC5Ev]+0x1f): undefined reference to
vtable for VidaliaNativeEventFilter'
collect2: error: ld returned 1 exit status
make[2]: *** [src/vidalia/CMakeFiles/vidalia.dir/build.make:2105: src/vidalia/vidalia] Error 1
make[1]: *** [CMakeFiles/Makefile2:598: src/vidalia/CMakeFiles/vidalia.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
Files that appear to be the cause of the error
https://github.com/a-ilin/vidalia/blob/alpha-qt5/src/vidalia/Vidalia.h
https://github.com/a-ilin/vidalia/blob/alpha-qt5/src/vidalia/Vidalia.cpp
Lines L112, L115, L128, L227 contain "VidaliaNativeEventFilter" in Vidalia.cpp
Code snippet
Line 109 - Line 129
/** Provides native event filtering with Qt5
*/
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
class VidaliaNativeEventFilter : public QAbstractNativeEventFilter
{
public:
VidaliaNativeEventFilter()
: QAbstractNativeEventFilter() {}
bool nativeEventFilter(const QByteArray& eventType, void* message, long* result);
};
#endif
/** Constructor. Parses the command-line arguments, resets Vidalia's
* configuration (if requested), and sets up the GUI style and language
* translation. */
Vidalia::Vidalia(QStringList args, int &argc, char **argv)
: QApplication(argc, argv)
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
, _nativeEventFilter(new VidaliaNativeEventFilter())
#endif
Code snippet
Line 218 - Line 242
/** On Windows, we need to catch the WM_QUERYENDSESSION message
* so we know that it is time to shutdown. */
#if defined(Q_OS_WIN)
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
bool
Vidalia::winEventFilter(MSG* msg, long* result)
{
#else
bool
VidaliaNativeEventFilter::nativeEventFilter(const QByteArray& /*eventType*/, void* message, long* result)
{
MSG* msg = (MSG*)message;
#endif
if (msg && (msg->message == WM_QUERYENDSESSION)) {
QApplication::quit();
}
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
return QApplication::winEventFilter(msg, result);
#else
return false;
#endif
}
#endif