Cmake 链接问题:未定义对 QPushButton 的引用

Posted

技术标签:

【中文标题】Cmake 链接问题:未定义对 QPushButton 的引用【英文标题】:Cmake link issue: undefined reference to 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) 【参考方案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】:

你有三个问题:

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

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

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

您的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

【讨论】:

以上是关于Cmake 链接问题:未定义对 QPushButton 的引用的主要内容,如果未能解决你的问题,请参考以下文章

将 armadillo/blas/lapack 与 cmake 链接(未定义对 `dgemv_' 的引用)

GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”

即使在链接库时,也会获得对 OpenCV 元素的未定义引用。使用 CMake

CMake“uuid”链接失败

PCL 和 CMake 的问题:链接时未定义 StatisticalOutlierRemoval

链接 cxx 可执行文件时出现 Cmake 错误未定义引用