错误 QApplication:没有这个文件或目录。

79

我安装了带有Qt的C++ SDK,但是当我尝试编译连接QApplication的代码时,它会给出以下错误:

Error QApplication: no such file or directory

我应该如何链接这些库?我查看了目录并找到了一个名为QApplication.h的文件;因此,我尝试使用-I(链接目录)来链接它,但仍然出现错误。


8
请问这个问题的标题是什么?来源是一个简单的文件,我认为我不需要发布它而只需提供链接:http://pastebin.com/972XtFUz。 - Ramy Al Zuhouri
1
$locate QApplication 的输出是什么? - shadyabhi
1
/home/ramy/Documents/C++QtSDK/Desktop/Qt/474/gcc/include/QtGui/QApplication /home/ramy/Documents/C++QtSDK/Madde/sysroots/harmattan_sysroot_10.2011.34-1_slim/usr/include/qt4/QtGui/QApplication /home/ramy/Documents/C++QtSDK/Simulator/Qt/gcc/include/QtGui/QApplication /usr/include/qt4/QtGui/QApplication - Ramy Al Zuhouri
1
在评论中,我告诉你要写运行$qmake -project -d -Wall,而你在执行命令时包含了$符号。排除5,那只是为了告诉你这是一个你必须在shell中编写的命令。 - shadyabhi
调试1:项目解析器:/usr/share/qt4/mkspecs/features/include_source_dir.prf:1 :INCLUDEPATH: :*=: (.) - Ramy Al Zuhouri
它要求我输入一个命令,并将我在上面的评论中发布的内容写下来,我只需使用ctrl+c中断,不会生成任何makefile。 - Ramy Al Zuhouri
14个回答

137

在Qt 5中,现在您需要将widgets添加到QT qmake变量中(在您的MyProject.pro文件中)。

 QT += widgets

这是我解决问题的方法:链接 - 4pie0
1
是的,如果您正在使用qmake,上述行将自动添加所有必要的编译器标志。 - Timmmm
@Timmmm 嗯,如果我是QT Creator的新手,我真的不明白在哪里添加这行代码,qt qmake变量是什么?一些配置项目文件或设置吗?(它可能是任何东西,我还不知道) - user924
这里有一个更明确的答案(在.pro文件中添加)。 - user924
将widget添加到QT变量后,我仍然收到此错误消息。 - Stepan Yakovenko

83

首先,错误信息QApplication: no such file or directory表示编译器无法找到此头文件。这与您在问题中提到的链接过程无关。

选项-I(大写i)用于指定包含(头文件)目录(这是您需要做的),而选项-L用于指定库目录。选项-l(小写l)用于将应用程序与指定的库链接起来。

但您可以利用Qt的优势:Qt有一个名为qmake的构建系统,可以使事情变得更加容易。例如,当我想要编译main.cpp时,我会创建一个main.pro文件。出于教育目的,假设此源代码是一个仅使用QApplicationQDeclarativeView的简单项目。一个适当的.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以解决此问题。


27
在Qt 5.x之后,您需要在**.pro**文件中添加QT += widgets - karlphillip
1
仍然在2019年工作,在Mojave中运行的QT5中拯救了我的生命。+1 - Rui F Ribeiro

38

针对QT 5

步骤1: .pro(在.pro文件中添加以下两行)

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

步骤2:main.cpp中,替换代码:

#include <QtGui/QApplication> 
#include <QApplication>

2
对于Qt 5,似乎包含的是*#include <QtWidgets/QApplication>。这是根据find /usr -name QApplication*得出的。 - jww

16

看起来您没有安装开发库。使用以下命令进行安装:

sudo apt-get install libqt4-dev

根据您在评论中提到的安装情况,只需重新安装它。现在,要更新locate数据库,请执行此命令:$sudo updatedb

然后执行$locate QApplication以检查您是否已安装头文件。

现在,转到您拥有代码的文件夹并键入这些命令。

qmake -project
qmake
make

然后你可以找到所创建的二进制文件。

或者,如果您想要GUI界面,可以使用Qt Creator。


如果我输入 qmake -project,终端会冻结几秒钟,我必须使用 ctrl+c 打断。 - Ramy Al Zuhouri
在命令行中输入 $qmake -project -d -Wall 并告诉我它卡在哪里了。另外,你试过QtCreator吗? - shadyabhi
ramy@ubuntu:~/Documents/C++/Prova$ $qmake -project -d -Wall未找到“-project”命令,您是不是想要: 来自软件包“turnin-ng”(宇宙)的“project”命令 -project:命令未找到 - Ramy Al Zuhouri
是的,我尝试过QTcreator,但它也显示没有QApplication。 - Ramy Al Zuhouri
请安装libqt4-dev软件包,然后重试。命令为:sudo apt-get install libqt4-dev。 - shadyabhi
很好,安装libqt4-dev正是我所需要的(我正在安装Ruby Gem Capybara-webkit)。 - Benja

6
在 Qt5 中,您应该使用 QtWidgets 而不是 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

4
请确保您使用的qmake版本与您想使用的QT版本相对应。为了确保,您可以运行以下命令:
$qmake -v

您的问题似乎是QT 3和4版本之间存在冲突的症状,可以在此处看到:http://lists.trolltech.com/qt4-preview-feedback/2005-11/thread00013-0.html。要解决这个问题,您可以删除旧版QT,或者在Makefile中明确指定qmake-qt4。

+1 是为了展示如何测试版本,并提供进一步信息的链接。 - Mark Taylor

1

嗯,虽然有点晚了,但我刚开始学习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中包含它。

1

在第一次执行之前,您需要在.pro文件中添加QT +=widgets。如果在添加此行之前执行,则无法正常工作,因此您需要从头开始创建文件。


1

CONFIG += c++11

将上述代码写在myproject.pro文件中。

我使用的是linuxmint 20.0操作系统。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Abhishek Dutt

1

我正在使用QT 6

我发现问题在于我设置的版本号

我设置的版本号大于6,意味着是7及以上版本,但我使用的是QT 6版本,所以我进行了更改:

greaterThan(QT_MAJOR_VERSION, 6) : QT += widgets

To

greaterThan(QT_MAJOR_VERSION, 5) : QT += widgets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接