【问题标题】:Undefined reference when building qt with cmake使用 cmake 构建 qt 时未定义的引用
【发布时间】:2017-05-10 01:59:32
【问题描述】:

我在使用 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 toMainWindow::MainWindow(QWidget*)' main.cpp:(.text+0x12f): 未定义引用MainWindow::~MainWindow()' main.cpp:(.text+0x1b5): undefined reference toMainWindow::~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()

该错误似乎与 cons 和 ~cons 有关。这是我认为出现问题的 MainWindow cpp 的一个 sn-p:

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

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

想法?

【问题讨论】:

    标签: qt cmake


    【解决方案1】:

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

    因此,您在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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-21
      • 2021-04-21
      • 1970-01-01
      • 2022-01-04
      • 2019-01-16
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多