2012-12-24 21 views
8

Ho un progetto relativamente semplice Qt 5.0 che utilizza CMake 2.8.9:Perché ricevo errori di "riferimento non definito a vtable ..." durante il collegamento di questa applicazione Qt 5.0?

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(); 
} 

Il progetto include anche un file .ui creato con Qt Creator 2.6.1 (MainWindow.ui).

Quando si tenta di costruire il file con g++ su Linux, ricevo i seguenti errori:

 
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 

Che cosa potrebbe causare questo tipo di errore? Recentemente sono passato a CMake dal qmake e non ricordo mai di aver incontrato questo grosso problema ottenendo un banale esempio da compilare. Che cosa sto facendo di sbagliato?


Edit: qui è il comando utilizzato per collegare tutto:

 
/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 

risposta

18

Risulta Dimenticavo:

set(CMAKE_AUTOMOC ON) 

Nella parte superiore del file CMakeLists.txt.

+2

Io ho impostato (CMAKE_AUTOMOC ON) ma continuo a vedere lo stesso errore che stavi vedendo. Inoltre, il mio comando di collegamento è uguale al tuo. Puoi per favore aiutare? –

+1

Inoltre, il file moc "nova_app_automoc.cpp "generato per il target" nova_app "ha questo:/* Questo file è generato automaticamente, non modificare */ enum some_compilers {need_more_than_nothing}; –

+6

Sto avendo quasi lo stesso identico problema, eppure ho impostato (CMAKE_AUTOMOC ON) già nel mio CMakeLists.txt e tuttavia ho ancora il problema !! –

2

ho lottato con questo per un lungo periodo con tutti i suggerimenti pubblicati qui:

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

E qui

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

Quello che dovevo fare era di specificare le cose nel giusto ordine. Ad esempio, quanto segue è la parte superiore del mio CMakeLists.txt. Notare che le due direttive di set CMAKE vengono prima add_executable. Una volta fatto questo, sono stato in grado di collegarmi senza simboli indefiniti e riferimenti vtable. Ho solo pensato di pubblicarlo a beneficio degli altri.

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}) 

Più tardi nel CMakeLists.txt Ho il seguente:

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) 

Che ha fatto il trucco.

Problemi correlati