【问题标题】:Cmake link issue: undefined reference to QPushButtonCmake 链接问题:未定义对 QPushButton 的引用
【发布时间】:2016-04-27 11:47:08
【问题描述】:

我刚开始使用 Qt。我在编译第一个示例时遇到问题。
main.cpp:

#include <QCoreApplication>
#include <QPushButton>

int main(int argc, char** argv)
{
  QCoreApplication app(argc, argv);
  QPushButton button ("Hello world !");

 return app.exec();
}

CMake.txt:

 cmake_minimum_required(VERSION 2.6)
 project(new)
 find_package(Qt4 REQUIRED)
 enable_testing()
 include_directories(${QT_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR})
 set(source_SRCS main.cpp)
 qt4_automoc(${source_SRCS})
 add_executable(new ${source_SRCS})
 target_link_libraries(new${QT_QTCORE_LIBRARY})
 add_subdirectory(tests)
 install(TARGETS new RUNTIME DESTINATION .)

我在构建时遇到的错误是:

undefined reference to `QPushButton::QPushButton(QString const&,QWidget*)'

这是一个链接问题,但我该如何解决呢?

【问题讨论】:

  • target_link_libraries(new${QT_QTCORE_LIBRARY}) 应该是 target_link_libraries(new ${QT_LIBRARIES})

标签: c++ qt cmake qt4


【解决方案1】:

以下是我认为您缺少的内容:

find_package(Qt4 REQUIRED QtGui)

查看您的 cmake,您可能希望将 target_link_libraries 更改为以下内容:

target_link_libraries(new ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY})

【讨论】:

  • 这个编译程序,但是执行后的错误是“QWidget: Cannot create a QWidget when no GUI is being used Aborted (core dumped)”。但我无法链接到 QtWidgets 库。
  • 那么错误可能在您的主目录中......“Qt 要求您在创建任何 QWidget 子类之前创建一个 QApplication”
  • 你最后的评论对我帮助很大。
【解决方案2】:

你有三个问题:

  1. 您没有链接到 Gui 模块(Qt 5 中的小部件模块)。这在the other answer 中有介绍。

  2. 您必须在基于小部件的应用程序中使用 QApplication。由于QPushButton 来自Gui 模块(Qt5 中的小部件),因此您不能只使用QCoreApplicationQGuiApplication:一旦您尝试实例化QWidget,您的程序就会崩溃。

  3. 您没有显示按钮,因此当您的程序启动时,一旦您修复上述问题,您将什么也看不到。

您的main.cpp 应如下所示:

#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
#include <QtGui>
#else
#include <QtWidgets>
#endif

int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  QPushButton button ("Hello world !");
  button.show();
  return app.exec();
}

【讨论】:

  • 谢谢。我没有在 main.cpp 中包含所有内容。现在一切都很好。
【解决方案3】:

您还需要链接到 QtGui 和 QtWidgets 库。在 qmake 中,它处理构成 Qt 的众多库中的哪一个,您必须在 cmake 中手动完成。

如果您查看 QPushButton (http://doc.qt.io/qt-5/qpushbutton.html) 的文档,“qmake”行会显示您需要的库。

【讨论】:

    【解决方案4】:

    考虑在 Qt 中使用 qmake 而不是 cmake。

    无论如何,QCoreApplication(参见docs)是主应用程序类的控制台版本,在 GUI 应用程序中不起作用。 QPushButton 是一个小部件类,可以单独存在并且会创建一个窗口(尽管您必须为此明确地使用show()),但只能使用QApplication

    在您的 *.pro 文件中使用 qmake 时,您需要像这样包含 widgets

    CONFIG += widgets
    

    并确保你没有

    CONFIG -= gui
    

    如果您坚持使用 cmake,请查看here

    【讨论】:

    • 谢谢!我以前没有使用过 qmake,但我会尝试一下。我看到了你的 cmake 解决方案。它在此行 find_package(Qt4Widgets REQUIRED) 失败。我需要一些额外的安装吗?或者手动添加 Qt4Widgets .cmake 文件。
    • find_package(Qt4Widgets REQUIRED) 这是错误的。应该是find_package(Qt4 REQUIRED)
    【解决方案5】:

    这个答案解决了我同样的问题:)


    好的, 我已经可以自己解决了。

    尽管他们也有问题:

    错误源于使用“Q_OBJECT”。 要解决该错误,请右键单击项目并选择“运行 qmake”,然后 >this:“Rebuild”。

    那么错误应该消失了;-)

    -卡西斯托

    https://forum.qt.io/topic/52439/get-undefined-reference-error-but-don-t-know-why/2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-01
      • 2010-09-13
      • 1970-01-01
      • 2020-10-08
      • 2016-06-10
      • 2021-10-14
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多