12

CMake2.8.9を使用する比較的単純なQt5.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();
}

プロジェクトには、.uiQt Creator 2.6.1(MainWindow.ui)で作成されたファイルも含まれています。

Linuxでファイルをビルドしようとするとg++、次のエラーが発生します。

CMakeFiles / hello-world.dir / MainWindow.cpp.o:関数 `MainWindow :: MainWindow()'内:
MainWindow.cpp:(。text + 0x3b): `vtableforMainWindow'への未定義の参照
MainWindow.cpp:(。text + 0x4d): `vtableforMainWindow'への未定義の参照
CMakeFiles / hello-world.dir / MainWindow.cpp.o:関数 `MainWindow ::〜MainWindow()'内:
MainWindow.cpp:(。text + 0xaf): `vtableforMainWindow'への未定義の参照
MainWindow.cpp:(。text + 0xc1): `vtableforMainWindow'への未定義の参照
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の先頭です。2つの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 に答える