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 中的小部件),因此您不能只使用QCoreApplication
或QGuiApplication
:一旦您尝试实例化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