2012-12-24 11 views
8

Mam stosunkowo prostą Qt 5.0 projekt wykorzystujący CUpewnij 2.8.9:Dlaczego podczas łączenia tej aplikacji Qt 5.0 pojawiają się błędy "niezdefiniowane odniesienie do vtable ..."?

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

Projekt zawiera również plik .ui utworzony za pomocą Qt Creator 2.6.1 (MainWindow.ui).

Gdy próbuję zbudować plik z g++ na Linux, otrzymuję następujące błędy:

 
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 

Co może być przyczyną tego rodzaju błąd? Niedawno przełączyłem się na CMake z qmake i nigdy nie pamiętam, żebym miał problem z uzyskaniem trywialnego przykładu do kompilacji. Co ja robię źle?


Edit: oto polecenie jest stosowane do łączenia wszystko:

 
/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 

Odpowiedz

18

okazuje zapomniałem:

set(CMAKE_AUTOMOC ON) 

Na początku pliku CMakeLists.txt.

+2

Mam zestaw (CMAKE_AUTOMOC ON), ale nadal widzę ten sam błąd, co widziałem. Ponadto moje polecenie link jest takie samo jak twoje. Czy możesz mi pomóc? –

+1

Również plik moc "nova_app_automoc.cpp "wygenerowany dla celu" nova_app "ma to w sobie:/* Ten plik jest generowany automatycznie, nie edytuj */ enum some_compilers {need_more_than_nothing}; –

+6

Mam prawie dokładnie ten sam problem, ale mam ustawiony (CMAKE_AUTOMOC ON) już w moim CMakeLists.txt i nadal mam problem! –

2

Walczyłem z tym przez długi czas przy użyciu wszystkich wskazówek opublikowanych tutaj:

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

I tu

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

Co miałem zrobić, to określić rzeczy w prawo zamówienie. Na przykład poniżej znajduje się wierzchołek mojego CMakeLists.txt. Zauważ, że dwie dyrektywy zestawu CMAKE są przed add_executable. Kiedy to zrobiłem, udało mi się połączyć bez niezdefiniowanych symboli i odnośników vtable. Po prostu myślałem, że opublikuję to dla dobra innych.

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

Później w CMakeLists.txt mam następujące:

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) 

To załatwiło sprawę.

Powiązane problemy