12

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

主窗口.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

主窗口.cpp:

#include "MainWindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow()
    : ui(new Ui::MainWindow)
{
}

MainWindow::~MainWindow()
{
    delete ui;
}

主.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:在函数“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 个退出状态

什么可能导致这种错误?我最近从 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
4

3 回答 3

21

原来我忘记了:

set(CMAKE_AUTOMOC ON)

在 CMakeLists.txt 文件的顶部。

于 2012-12-24T01:17:41.010 回答
5

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

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)

那成功了。

于 2016-06-21T18:24:49.093 回答
2

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

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

set(SOURCES
    buffer.h
    ITVSet.h
    MainWindow.h
    MainWindow.cpp
    TVSet.h
    TVSet.cpp
)
于 2019-08-07T17:08:31.353 回答