使用cmake构建qt时未定义的引用

使用cmake构建qt时未定义的引用,qt,cmake,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):未定义对MainWindow::MainWindow(QWidget*)的引用 main.cpp:(.text+0x12f):对MainWindow::~MainWindow()的未定义引用 main

我在使用Qt和VTK构建项目时遇到问题。我正在使用Cmake 3.5.1、vtk7.1和Qt5.2.1。在运行cmake之后运行make时,会出现以下错误:

CMakeFiles/MainWindow.dir/main.cpp.o:在函数
main'中:
main.cpp:(.text+0x10a):未定义对
MainWindow::MainWindow(QWidget*)的引用 main.cpp:(.text+0x12f):对
MainWindow::~MainWindow()的未定义引用
main.cpp:(.text+0x1b5):对
MainWindow::~MainWindow()的未定义引用 collect2:错误:ld返回了1个退出状态 CMakeFiles/MainWindow.dir/build.make:218:目标“MainWindow”的配方失败 生成[2]:*[MainWindow]错误1 CMakeFiles/Makefile2:67:目标“CMakeFiles/MainWindow.dir/all”的配方失败 生成[1]:*[CMakeFiles/MainWindow.dir/all]错误2 Makefile:83:目标“全部”的配方失败 make:**[全部]错误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()
错误似乎与cons和~cons有关。以下是我认为出现问题的主窗口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();
我排除了构造函数的主体,因为它很长,我认为它与错误无关


想法?

您可能忘记更新
Srcs
变量,以包含所有必要的cpp文件,从而构建
main窗口
目标(可执行文件)

因此,在
add_executable(MainWindow${Srcs})
语句中完全省略了实现
MainWindow
类的代码。这样做的副作用是,链接器只看到从
main.cpp
调用
MainWindow
,这可能相当于创建一个函数并(隐式地)销毁一个函数,因此链接器抱怨这两个函数没有定义

因此,要解决所有这些问题,请在
set(Srcs main.cpp)
中扩展
${Srcs}
的定义,如下所示:

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