使用cmake

时间:2016-12-24 21:50:47

标签: qt cmake

我在使用Qt和VTK构建项目时遇到了麻烦。我使用的是Cmake 3.5.1,vtk7.1和Qt5.2.1。当我在运行cmake后运行make时出现此错误:

  

CMakeFiles / MainWindow.dir / main.cpp.o:在函数main': main.cpp:(.text+0x10a): undefined reference to MainWindow :: MainWindow(QWidget *)'   main.cpp :(。text + 0x12f):未定义引用MainWindow::~MainWindow()' main.cpp:(.text+0x1b5): undefined reference to MainWindow :: ~MainWindow()'   collect2:错误:ld返回1退出状态   CMakeFiles / MainWindow.dir / build.make:218:目标' MainWindow'失败   make [2]: * [MainWindow]错误1   CMakeFiles / Makefile2:67:目标' CMakeFiles / MainWindow.dir / all'失败   make [1]:* [CMakeFiles / MainWindow.dir / all]错误2   Makefile:83:目标配方'全部'失败   make:*** [all]错误2

我的CmakeLists.txt看起来像这样:

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

错误似乎与缺点和缺点有关。以下是MainWindow cpp的片段,我认为问题出现了:

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

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

以下是一些标题:

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

我排除了构造函数的主体,因为它很长,我不认为它与错误有任何关系。

思想?

1 个答案:

答案 0 :(得分:1)

您可能忘记更新Srcs变量以包含所有必需的cpp文件,以构建MainWindow目标(可执行文件)。

因此,您省略了在MainWindow语句中完全实现add_executable(MainWindow ${Srcs})类的代码。这有副作用,链接器只看到来自MainWindow的{​​{1}}的函数调用,这可能只是创建一个和(隐式)销毁一个,因此链接器抱怨这些确切的2个函数正在未定义。

因此,要解决所有这些问题,请使用以下内容扩展main.cpp${Srcs}的定义:

set( Srcs main.cpp )