为什么我这个链接的Qt 5.0的应用程序时会出现“未定义引用的vtable ......”的错误?(

2019-07-17 12:49发布

我有一个使用的CMake 2.8.9一个相对简单的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();
}

该项目还包括一个.ui与Qt Creator的2.6.1(MainWindow.ui)创建的文件。

当我试图建立一个与文件g++在Linux上,我收到以下错误:

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

怎么可能会导致这种错误的? 我最近从切换到CMake的qmake我从来没有记得运行到这么多的麻烦一个简单的例子来编译。 我究竟做错了什么?


编辑:这里是正在使用链接的一切命令:

/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

Answer 1:

原来我忘了:

set(CMAKE_AUTOMOC ON)

在的CMakeLists.txt文件的顶部。



Answer 2:

我这个奋斗了使用这里发布的所有提示的很长一段时间:

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

和这里

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

我不得不这样做是正确的顺序指定的东西。 例如,下面是我的CMakeLists.txt的顶部。 注意两个CMake的指令集之前add_executable来。 一旦我这样做,我能不未定义的符号和虚函数表引用链接。 我只是想我会发布这个为他人的利益。

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

后来在我的CMakeLists.txt有以下几点:

 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)

该诀窍。



文章来源: Why am I getting “undefined reference to vtable…” errors when linking this Qt 5.0 application?
标签: qt cmake qt5