2016-12-24 8 views
0

QtとVTKを使用してプロジェクトを構築するのに問題があります。私はCmake 3.5.1、vtk7.1、Qt5.2.1を使用しています。私はcmakeの実行後にmakeを実行すると、私はこのエラーを取得:私CmakeLists.txtはこのようになりますQakeをcmakeでビルドするときの未定義の参照

CMakeFiles/MainWindow.dir/main.cpp.o: In function main': main.cpp:(.text+0x10a): undefined reference to MainWindow::MainWindow(QWidget*)' main.cpp:(.text+0x12f): undefined reference to MainWindow::~MainWindow()' main.cpp:(.text+0x1b5): undefined reference to MainWindow::~MainWindow()' collect2: error: ld returned 1 exit status CMakeFiles/MainWindow.dir/build.make:218: recipe for target 'MainWindow' failed make[2]: * [MainWindow] Error 1 CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/MainWindow.dir/all' failed make[1]: * [CMakeFiles/MainWindow.dir/all] Error 2 Makefile:83: recipe for target 'all' failed make: *** [all] Error 2

cmake_minimum_required(VERSION 2.8.8) 
if(POLICY CMP0020) 
    cmake_policy(SET CMP0020 NEW) 
endif() 
if(POLICY CMP0025) 
    cmake_policy(SET CMP0025 NEW) # CMake 3.0 
endif() 
if(POLICY CMP0043) 
    cmake_policy(SET CMP0043 NEW) # CMake 3.0 
endif() 
if(POLICY CMP0053) 
    cmake_policy(SET CMP0053 NEW) # CMake 3.1 
endif() 
project(MainWindow) 

find_package(VTK REQUIRED) 
include(${VTK_USE_FILE}) 

if("${VTK_QT_VERSION}" STREQUAL "") 
    message(FATAL_ERROR "VTK was not built with Qt") 
endif() 

set(Srcs main.cpp) 

if(VTK_QT_VERSION VERSION_GREATER "4") 
    find_package(Qt5 COMPONENTS Core REQUIRED QUIET) 

    add_executable(MainWindow ${Srcs}) 
    qt5_use_modules(MainWindow Core Gui Widgets) 
    target_link_libraries(MainWindow ${VTK_LIBRARIES}) 
else() 
    find_package(Qt4 REQUIRED) 
    include(${QT_USE_FILE}) 
    # Use what VTK built with 
    set(QT_QMAKE_EXECUTABLE ${VTK_QT_QMAKE_EXECUTABLE} CACHE FILEPATH "") 
    set(QT_MOC_EXECUTABLE ${VTK_QT_MOC_EXECUTABLE} CACHE FILEPATH "") 
    set(QT_UIC_EXECUTABLE ${VTK_QT_UIC_EXECUTABLE} CACHE FILEPATH "") 
    include_directories(${QT_INCLUDE_DIR}) 

    add_executable(MainWindow ${Srcs}) 
    target_link_libraries(MainWindow ${QT_LIBRARIES} ${VTK_LIBRARIES}) 
endif() 

エラーが短所と〜短所に関連付けられているように見えます。ここで私は、問題が生じていると思うメイン・ウィンドウCPPから抜粋されています。それは非常に長いので、私は、コンストラクタのボディを除外

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 
    /*signals: 
    void overVolume(int, int, int);*/ 
public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

MainWindow::MainWindow(QWidget *parent) : 
QMainWindow(parent), 
ui(new Ui::MainWindow){  

MainWindow::~MainWindow() 
{ 
    writeSettings(); 
    axes->Delete(); 
    marker->Delete(); 
    delete ui; 
} 

、ここでは、ヘッダの一部であります私はそれがエラーとは関係がないとは思わない。

思考?

答えて

0

おそらくMainWindowターゲット(実行ファイル)を構築するためにすべて必要なのcppファイルを含めるためにあなたのSrcs変数を更新するのを忘れ。

この結果、クラスを実装するためのコードは、完全にadd_executable(MainWindow ${Srcs})ステートメントで省略されます。これは、リンカーがへの関数呼び出しをあなたのmain.cppから見ているだけの副作用を持っています。これは、おそらくちょうど1つを作成し、(暗黙的に)1つを破棄することになります。

# assuming MainWindow is implemented in mainwindow.cpp 
set(Srcs main.cpp mainwindow.cpp) 

だから、すべてこの問題を解決するために、このようなものでset(Srcs main.cpp)${Srcs}のあなたの定義を拡大