我安装了带有Qt的C++ SDK,但是当我尝试编译连接QApplication的代码时,它会给出以下错误:
Error QApplication: no such file or directory
我应该如何链接这些库?我查看了目录并找到了一个名为QApplication.h的文件;因此,我尝试使用-I(链接目录)来链接它,但仍然出现错误。
在Qt 5中,现在您需要将widgets
添加到QT
qmake变量中(在您的MyProject.pro
文件中)。
QT += widgets
首先,错误信息QApplication: no such file or directory
表示编译器无法找到此头文件。这与您在问题中提到的链接过程无关。
选项-I
(大写i)用于指定包含(头文件)目录(这是您需要做的),而选项-L
用于指定库目录。选项-l
(小写l)用于将应用程序与指定的库链接起来。
但您可以利用Qt的优势:Qt有一个名为qmake的构建系统,可以使事情变得更加容易。例如,当我想要编译main.cpp时,我会创建一个main.pro文件。出于教育目的,假设此源代码是一个仅使用QApplication
和QDeclarativeView
的简单项目。一个适当的.pro文件应该是:
TEMPLATE += app
QT += gui declarative
SOURCES += main.cpp
然后,在该目录中执行qmake
,以创建用于编译应用程序的Makefile,最后执行make
来完成工作。
在我的系统上,这个make
命令会输出:
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_DECLARATIVE_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/opt/qt_47x/mkspecs/linux-g++ -I. -I/opt/qt_47x/include/QtCore -I/opt/qt_47x/include/QtGui -I/opt/qt_47x/include/QtDeclarative -I/opt/qt_47x/include -I/usr/X11R6/include -I. -o main.o main.cpp
g++ -Wl,-O1 -Wl,-rpath,/opt/qt_47x/lib -o main main.o -L/opt/qt_47x/lib -L/usr/X11R6/lib -lQtDeclarative -L/opt/qt_47x/lib -lQtScript -lQtSvg -L/usr/X11R6/lib -lQtSql -lQtXmlPatterns -lQtNetwork -lQtGui -lQtCore -lpthread
注意:我将Qt安装在另一个目录中 --> /opt/qt_47x
编辑:Qt 5.x及更高版本
在.pro文件中添加QT += widgets
以解决此问题。
QT += widgets
。 - karlphillip针对QT 5
步骤1:
.pro
(在.pro文件中添加以下两行)
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
步骤2:
在main.cpp
中,替换代码:
#include <QtGui/QApplication>
#include <QApplication>
#include <QtWidgets/QApplication>
。这是根据find /usr -name QApplication
*得出的。 - jww看起来您没有安装开发库。使用以下命令进行安装:
sudo apt-get install libqt4-dev
根据您在评论中提到的安装情况,只需重新安装它。现在,要更新locate数据库,请执行此命令:$sudo updatedb
然后执行$locate QApplication
以检查您是否已安装头文件。
现在,转到您拥有代码的文件夹并键入这些命令。
qmake -project
qmake
make
然后你可以找到所创建的二进制文件。
或者,如果您想要GUI界面,可以使用Qt Creator。
有关更多信息,请参阅官方文档。http://developer.qt.nokia.com/doc/qt-4.8/gettingstartedqt.html
要学习如何使用Qt Creator,请使用http://doc.qt.nokia.com/qtcreator-2.2/creator-qml-application.html
$qmake -project -d -Wall
并告诉我它卡在哪里了。另外,你试过QtCreator吗? - shadyabhiQtWidgets
而不是 QtGui
。#include <QtGui/QComboBox> // incorrect in QT5
#include <QtWidgets/QComboBox> // correct in QT5
或者
#include <QtGui/QStringListModel> // incorrect in QT5
#include <QtCore/QStringListModel> // correct in QT5
$qmake -v
嗯,虽然有点晚了,但我刚开始学习Qt,也许这可以帮助到某些人:
如果您使用的是Qt Creator,则在创建项目时选择要与项目一起使用的套件,假设您选择了Desktop Qt <version-here> MinGW 64-bit
。对于Qt 5,如果您打开了安装的Qt文件夹,您会发现其中一个名为安装的Qt版本的文件夹,您可以在此处找到可以选择的套件。
您可以转到/PATH/FOR/Qt/mingw<version>_64/include
,在这里您可以找到您程序中可以使用的所有包含的路径,只需搜索QApplication
,并在QtWidgets
文件夹中找到它,因此您可以使用#include <QtWidgets/QApplication>
,因为路径从include
文件夹开始。
对于其他标题,如果您卡住了,请执行相同的操作,并针对其他套件进行操作。
注意:"all the includes you can use"并不意味着这些是您唯一可以使用的,例如如果您包含iostream
,那么编译器将从/PATH/FOR/Qt/Tools/mingw<version>_64/lib/gcc/x86_64-w64-mingw32/7.3.0/include/c++/iostream
中包含它。在第一次执行之前,您需要在.pro文件中添加QT +=widgets。如果在添加此行之前执行,则无法正常工作,因此您需要从头开始创建文件。
CONFIG += c++11
将上述代码写在myproject.pro文件中。
我使用的是linuxmint 20.0操作系统。
我正在使用QT 6
我发现问题在于我设置的版本号
我设置的版本号大于6,意味着是7及以上版本,但我使用的是QT 6版本,所以我进行了更改:
greaterThan(QT_MAJOR_VERSION, 6) : QT += widgets
To
greaterThan(QT_MAJOR_VERSION, 5) : QT += widgets
$locate QApplication
的输出是什么? - shadyabhi$qmake -project -d -Wall
,而你在执行命令时包含了$
符号。排除5
,那只是为了告诉你这是一个你必须在shell中编写的命令。 - shadyabhi