【问题标题】:Why am I getting "undefined reference to vtable..." errors when linking this Qt 5.0 application?为什么在链接此 Qt 5.0 应用程序时出现“对 vtable 的未定义引用...”错误?
【发布时间】:2012-12-10 13:09:07
【问题描述】:

我有一个使用 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();
}

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

当我尝试在 Linux 上使用 g++ 构建文件时,我收到以下错误:

CMakeFiles/hello-world.dir/MainWindow.cpp.o:在函数“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:在函数“MainWindow::~MainWindow()”中: MainWindow.cpp:(.text+0xaf): undefined reference to `vtable for MainWindow' MainWindow.cpp:(.text+0xc1): undefined reference to `vtable for MainWindow' collect2:错误:ld 返回 1 个退出状态

什么可能导致这种错误?我最近从 qmake 切换到 CMake,我从不记得在编译一个简单的示例时遇到了这么多麻烦。我做错了什么?


编辑:这是用于链接所有内容的命令:

/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

【问题讨论】:

    标签: qt cmake qt5


    【解决方案1】:

    原来我忘了:

    set(CMAKE_AUTOMOC ON)
    

    在 CMakeLists.txt 文件的顶部。

    【讨论】:

    • 我确实设置了(CMAKE_AUTOMOC ON),但我仍然看到与您看到的相同的错误。另外,我的链接命令和你的一样。你能帮忙吗?
    • 另外,为目标 "nova_app" 生成的 moc 文件 "nova_app_automoc.cpp" 有这个: /* 这个文件是自动生成的,不要编辑*/ enum some_compilers { need_more_than_nothing };跨度>
    • 我遇到了几乎完全相同的问题,但我已经在我的 CMakeLists.txt 中设置了(CMAKE_AUTOMOC ON),但我仍然遇到问题!
    • @AdamMiller 我知道这是旧的,但如果其他人遇到同样的问题,cmake 需要知道在哪里可以找到标题。在我将所有标题与我的来源一起使用之前,我遇到了你遇到的问题。通过详细的构建,我可以看到 automoc 没有生成任何内容。
    【解决方案2】:

    使用此处发布的所有提示,我为此苦苦挣扎了很长时间:

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

    这里

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

    我要做的就是以正确的顺序指定事物。例如,以下是我的 CMakeLists.txt 的顶部。请注意,两个 CMAKE 设置指令位于 add_executable 之前。一旦我这样做了,我就能够在没有未定义符号和 vtable 引用的情况下进行链接。我只是想我会为了他人的利益而发布这个。

    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)
    

    成功了。

    【讨论】:

    • 为我工作,谢谢!问题已通过qt5_wrap_cpp(gui_SRC gui.h gui.cpp) 解决。实际上,我添加了 .h 文件而不是 gui.cpp,这就是问题所在,现在我将它们更改为 .cpp 文件并解决了问题,谢谢。
    【解决方案3】:

    我昨天也遇到了这个问题,上面提到的答案没有帮助。我已经用过set (CMAKE_AUTOMOC ON)qt5_wrap_cpp

    我试图记住我做了什么,因为我有一个工作版本,但在“一些”更改后它停止工作。我终于记得我试图将包含文件拆分为单独的目录层次结构。在恢复它并将包含文件放回CMakeLists.txt 之后,它再次工作。我当然不知道为什么,我想知道出了什么问题,但我现在决定将包含放在 cpp 文件附近。

    set(SOURCES
        buffer.h
        ITVSet.h
        MainWindow.h
        MainWindow.cpp
        TVSet.h
        TVSet.cpp
    )
    

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      相关资源
      最近更新 更多