2012-12-24 11 views
8

Ich habe ein relativ einfaches Qt 5.0-Projekt bekommt die CMake 2.8.9 verwendet:Warum bekomme ich "undefinierte Referenz auf vtable ..." Fehler beim Verknüpfen dieser Qt 5.0-Anwendung?

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:

Das Projekt enthält auch eine .ui Datei, die mit Qt Creator 2.6.1 (MainWindow.ui) erstellt wurde.

Wenn ich versuche, die Datei mit g++ auf Linux zu bauen, erhalte ich folgende Fehler:

 
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 

Was möglicherweise diese Art von Fehler verursachen könnte? Ich bin vor kurzem von qmake zu CMake gewechselt und ich erinnere mich nie daran, in so viele Schwierigkeiten zu geraten, ein kleines Beispiel zu kompilieren. Was mache ich falsch?


Edit: hier ist der Befehl verwendet wird, alles zu verknüpfen:

 
/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 

Antwort

18

Stellt sich heraus, ich vergaß:

set(CMAKE_AUTOMOC ON) 

An der Spitze der CMakeLists.txt Datei.

+2

Ich habe gesetzt (CMAKE_AUTOMOC ON), aber ich sehe immer noch den gleichen Fehler, wie Sie gesehen haben. Außerdem ist mein Link-Befehl der gleiche wie Ihr. Können Sie bitte helfen? –

+1

Auch die Moc-Datei "nova_app_automoc.cpp "für das Ziel generiert" nova_app "hat das drin:/* Diese Datei wird automatisch generiert, nicht bearbeiten */ enum some_compilers {need_more_than_nothing}; –

+6

Ich habe fast genau das selbe Problem, aber ich habe gesetzt (CMAKE_AUTOMOC ON) schon in meiner CMakeLists.txt und trotzdem bekomme ich das Problem !! –

2

ich für eine lange Zeit mit diesem zu kämpfen alle hier veröffentlichten die Hinweise mit:

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

Und hier

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

Was ich angeben wurde Dinge richtig zu tun hatte Auftrag. Zum Beispiel ist das Folgende der Anfang meiner CMakeLists.txt. Beachten Sie, dass die zwei CMAKE-set-Anweisungen vor add_executable kommen. Sobald ich dies getan habe, konnte ich ohne undefinierte Symbole und Vtable-Referenzen verknüpfen. Ich dachte nur, ich würde dies zum Wohle anderer posten.

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

Später im CMakeLists.txt ich habe folgendes:

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) 

, die den Trick tat.

Verwandte Themen