关于Ubuntu中编译Qt4出错的问题QApplication not found or not such a file

本文记录了解决Ubuntu环境下Qt4编译错误的过程。作者遇到的问题是在编译Qt4程序时,系统默认使用了Qt3的编译器,导致编译失败。通过调整系统配置,更改为Qt4编译器后,问题得以解决。
10月21日
关于Ubuntu中编译Qt4出错的问题
今天在进行Qt4初体验的时候发现,照搬书上的源代码竟然也会出错。
==================================================
#include <QApplication>
#include <QString>
#include <QLabel>
#include <QWidget>
#include <QDebug>
#include <QTextStream>

int main(int argc, char * argv[]){
    QApplication myapp(argc, argv);
    QWidget wid;
    qDebug() << "sizeof widget: " << sizeof(wid)
        << " sizeof qapplication: " << sizeof(myapp)
        << endl;
    QString message;
    QTextStream buf(&message);
   
    buf << "A QWidget is " << sizeof(wid) << "bytes. /nA QObject is " << sizeof(QObject)
        << "bytes. /nA QApplication is " << sizeof(myapp) << "bytes." << endl;
   
    qDebug() << message;
    QLabel label(message);
    return myapp.exec();
};
==================================================
具体报错为:QApplication not found or not such a file 之类的一大堆。由于是用的Ubuntu在线安装的Qt4,故一般不会出现类库缺失或者无法使用的情况。根据以往的经验,问题计有可能出在编译器上。
执行:
~$  export
显示系统环境变量,可以找到类库的路径,没问题。
~$  qmake -v
QMake version 2.01a
Using Qt version 3.2 in /usr/lib

问题出来了,由于我们这个测试程序是基于Qt4的,在Qt3下是无法编译通过的,因此应该将编译器改为Qt4。但是我明明在系统中安装的是Qt4,没有用Qt3啊~~于是继续:
~$  which qmake
qmake: /etc/alternatives

ok,找到了,
~$  cd  /etc/alternatives
找到qmake,是一个链接,找到它的源文件,竟然是/usr/bin/qmake-qt3 !!!!原来如此。接下来就简单了,删掉这个链接,然后做一个到/usr/bin/qmake-qt4的链接就ok了。如下:
~$  sudo rm /etc/alternatives/qmake
~$  sudo ln -s  /usr/bin/qmake-qt4 /etc/alternatives/qmake

再试一下,现在系统的Qt版本,
~$  qmake -v
QMake version 2.01a
Using Qt version 4.3.4 in /usr/lib

哈哈,搞定,编译及结果:
~$  qmake -project
~$  qmake
~$  make

默认结果是一个名为qt的可执行程序(当然也可以在Makefile中将 TARGET 项改为别的名字),执行之:
~$  ./qt
"A QWidget is 20bytes.
A QObject is 8bytes.
A QApplication is 8bytes.
"

通过!
<think>好的,我现在需要帮助用户解决QtQApplication文件未找到的错误。首先,回顾用户之前的问题,他们遇到了QMainWindow文件未找到的问题,现在又遇到了QApplication问题,这两个都属于QtWidgets模块,可能原因类似。 首先,用户之前的问题解决方案中提到了未正确包含QtWidgets模块,所以可能用户这次的问题也是类似的。QApplication位于QtWidgets模块中,所以需要检查是否在.pro文件中添加了QT += widgets。用户可能在迁移项目时没有更新.pro文件,或者新建项目时忘记包含这个模块。 接下来,用户提供的引用中有关于QtConcurrent库缺失的错误(引用1),这可能涉及到链接库的问题,但QApplication问题更多是头文件包含或模块配置的问题。另外,引用4中的代码示例显示用户正在尝试创建一个命令行窗口,这可能涉及到QtWidgets和QApplication的使用,进一步确认用户的项目需要正确包含这些模块。 用户提到在Linux环境下开发(引用3),但错误可能跨平台。需要确保无论Windows还是Linux,Qt的安装都完整,特别是QtWidgets组件。此外,用户可能在使用旧版本的Qt,比如Qt4Qt5的迁移问题,因为Qt5将Widgets模块独立出来,旧代码可能没有更新包含路径或模块声明。 可能的解决步骤包括: 1. 检查.pro文件是否包含QT += widgets。 2. 确保头文件包含正确,如#include <QApplication>,而不是旧式的包含路径。 3. 确认Qt安装是否完整,尤其是QtWidgets组件。 4. 清理构建缓存,避免旧的构建配置残留。 5. 检查环境变量和Qt版本配置是否正确,特别是在使用不同工具链时。 另外,用户之前的回答中提到了验证方法,即创建一个最小测试项目来确认问题是否解决,这同样适用于当前的问题。用户可能没有正确设置新的项目,或者存在路径配置错误。需要引导用户逐步检查这些配置点,并提供具体的代码示例和命令行操作,确保他们能一步步排除问题。 最后,用户可能需要了解如何保持代码的向后兼容性,或者如何处理不同Qt版本之间的模块变化,这也是相关问题的扩展点。需要确保回答结构清晰,步骤明确,并引用之前的解决方案中的要点,如显式声明模块依赖和正确的头文件包含方式。</think>### 解决方案:Qt QApplication文件未找到错误 #### 原因分析 QApplication属于QtWidgets模块的核心类,该问题通常由以下原因导致: 1. **未声明QtWidgets模块依赖**:Qt5将QApplicationQtGui迁移至QtWidgets模块,需显式声明依赖[^1][^2] 2. **头文件包含方式错误**:使用旧版Qt4的包含路径格式会导致路径解析失败 3. **Qt安装组件缺失**:未安装QtWidgets开发组件或选择了最小化安装[^3] 4. **构建环境残留**:旧版本构建缓存导致新配置未生效 #### 逐步解决方法 1. **更新.pro项目配置** 在Qt项目文件中添加: ```qmake QT += widgets core gui # 必须包含QtWidgets模块[^2] ``` ![Qt模块配置示意图](https://example.com/qt-modules.png) 2. **验证头文件包含方式** ```cpp // 正确方式(Qt5标准) #include <QApplication> // 错误方式(Qt4遗留格式) // #include <QtGui/QApplication> ``` 3. **检查Qt安装完整性** - 通过`Qt Maintenance Tool`确认已勾选: - **Qt Widgets**(必选) - **Desktop gcc 64-bit**(根据编译器选择) - 验证安装路径包含`QtWidgets`目录: ```bash ls $QTDIR/include/QtWidgets ``` 4. **环境变量配置(Linux示例)** ```bash export QTDIR=/opt/Qt/5.15.2/gcc_64 export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH ``` 5. **代码适配示例(含错误处理)** ```cpp #include <QApplication> // 必须优先包含 #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建应用对象 QLabel label("Hello Qt6!"); label.show(); return app.exec(); // 进入事件循环[^4] } ``` 6. **强制刷新构建系统** ```bash # 清理旧构建 make distclean # 重新生成Makefile qmake -spec linux-g++ # 根据平台选择spec # 重新编译 make -j4 ``` #### 验证测试 创建最小测试项目验证基础功能: ```cpp // main.cpp #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); // 核心对象创建测试 return a.exec(); } ``` 编译命令: ```bash g++ main.cpp -I$QTDIR/include -L$QTDIR/lib -lQt5Widgets -lQt5Core -lQt5Gui ``` #### 进阶调试技巧 - 使用`qmake -query`查看当前Qt配置: ```bash qmake -query QT_INSTALL_HEADERS ``` - 通过`strace`跟踪文件查找过程(Linux): ```bash strace -e openat make 2>&1 | grep QApplication ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值