Qt-预编译头文件PCH

  • 需求:Qt工程过大,每个文件都单独添加对应的库文件,繁琐而且执行速度过慢
  • 实现:使用Use Precompiled headers (PCH)预编译头文件
  • note:PCH不会提高生成、编译文件的速度,可以提高运行程序的速度(实际使用感受),虽然理论上是极大提高编译速度,但是不用额外添加重复的头文件确实很省心。

1 添加pch.h

工程里添加任意文件,这里我添加pch.h

代码如下:

// Add C includes here

#if defined __cplusplus
// Add C++ includes here
//#include <iostream>
#include <vector>
#include <QApplication>
#include <QObject>
#include <qglobal.h>
#include <QDir>
#include <QIntValidator>
//Add Qt includes here
#include <QToolTip>
#include <QDebug>
#include <QMainWindow>
#include <QDialog>
#include <QFileDialog>          //文件选择对话框
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QTimer>
#include <QTextCodec>
#include <QThread>                  //多线程
#include <QXmlStreamWriter>
#include <QXmlStreamReader>
#include <QFile>                    //文件输入输出流
#include <QMessageBox>              //提示框

//QT += sql //qt数据库文件
//#include <QDomDocument>
//#include <QtSql>                    //qt DataBase
//#include <QSqlDatabase>             //qt Connect DataBase
#include <bits/c++config.h>         //byte unsigned char类型
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QGraphicsPixmapItem>
#include <QGraphicsSceneWheelEvent>

//QT += network//Qt网络文件
//#include <QtNetwork>
//#include <QHostAddress>
//#include <QUdpSocket>

#include <QString>
#include <QMutex>//qt互斥锁
#include <QMutexLocker>
#include <QWaitCondition>
#include <QQueue>
#include <QMap> //map容器,存储电平值和频率的键值对
#include <QJsonObject> //json数据类型头文件
#include <QJsonArray>//json数据类型头文件
#include <QVariantMap>
#include <QJsonDocument>
#include <QDateTime>
#include <QtMath>
#include <QPainter>
#include <QProxyStyle>

//QT += webenginewidgets //Qt与html及js 交互文件
//#include <QWebEngineView>
//#include <QWebChannel>
//#include <QWebEnginePage>
//#include <QSharedMemory> //qt共享内存

#include <QMouseEvent>//自定义鼠标事件
#include <QVBoxLayout>
#include <QDesktopWidget>
#include <QPropertyAnimation>//动画效果
#include <QStandardItemModel>
#include <QPalette>
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#include <QMovie>
#endif

2 pro文件里添加预编译

CONFIG += precompile_header

PRECOMPILED_HEADER = pch.h

3 更改生成编译文件的路径

MOC_DIR = tmp/moc
RCC_DIR = tmp/rcc
UI_DIR = tmp/ui
OBJECTS_DIR = tmp/obj

在pro文件中添加上述代码,可以使生成的编译文件分别对应存放到相应的路径

  • Qt练习时长两年半,接qt,C++兼职,课设,指导等;
  • VX:QAQ2333oooo
  • QQ:1580947517
<think>我们参考多个引用内容,总结关于预编译头文件(PCH)的常见问题和解决方案,特别是针对Qt项目的。引用[1]提到在Qt预编译的简单方法:在.pro文件中加入四行代码,并创建一个stable.h文件存放需要预编译的内容。同时提到使用预编译头时,参数设置需要注意(例如Zm750而不是Zm1000)。引用[2]和引用[3]则提到了预编译头文件报错的常见原因(如编译器版本不一致、C/C++混合使用等)以及解决方式(修改预编译头设置等)。针对Qt项目中预编译头文件报错的解决方案,我们结合引用内容和一般处理步骤,整理如下:1.确保.pro文件中的预编译头设置正确:在.pro文件中,通常需要添加如下设置(参考引用[1]):```CONFIG+=precompile_header#启用预编译头PRECOMPILED_HEADER=stable.h#指定预编译头文件```注意:`stable.h`是预编译头文件,其中应该包含项目中不经常修改的头文件(如系统头文件、第三方库头文件等)。同时,注意`stable.h`文件应该被正确创建并放置在项目目录中。2.检查预编译头文件的包含:在需要使用预编译头的源文件中(通常包括所有源文件),确保第一个包含的头文件就是预编译头文件(`stable.h`)[^3]。因为预编译头要求源文件以包含预编译头文件开始,否则编译器可能无法识别预编译头。3.检查编译器选项:引用[1]中提到,在Qt预编译时可能遇到编译参数的问题(如Zm参数)。Zm选项用于指定编译器分配内存的倍数,有时需要调整(例如从Zm1000改为Zm750)。这可以在.pro文件中通过QMAKE_CXXFLAGS添加:```QMAKE_CXXFLAGS+=-Zm750```但请注意,不同编译器(如MSVC和GCC)的选项可能不同,此例中的Zm是MSVC的选项。如果使用的是GCC,则不需要这个选项。因此,需要根据所使用的编译器来调整。4.清理和重新构建:如果预编译头文件(.pch或.gch)已经生成,但是后续修改了预编译头文件的内容(如stable.h中添加或删除了头文件),则需要清理项目并重新构建,因为预编译头文件需要重新生成。5.避免在预编译头文件中放置经常变动的代码:预编译头文件应该只包含稳定的、不经常变化的代码,否则每次修改都会导致整个项目重新编译,降低编译效率[^3]。6.检查预编译头文件的一致性:引用[2]提到报错可能是由于预编译头文件来自不同编译器版本,或者C/C++混合使用。确保项目中所有源文件都使用同一种语言(C或C++),并且整个项目使用相同编译器版本。7.如果以上方法无效,考虑禁用预编译头:如果问题仍然存在,可以临时禁用预编译头进行测试。在.pro文件中将`CONFIG+=precompile_header`注释掉,然后重新构建项目。但这会降低编译速度,所以只是作为临时排除问题的手段。8.对于多模块项目:如果项目包含多个子项目(子模块),确保每个模块的预编译头设置是独立的。一个模块的预编译头不应该被其他模块使用,除非特别设置。具体操作步骤:步骤1:在.pro文件中设置预编译头确保你有类似以下设置:```CONFIG+=precompile_headerPRECOMPILED_HEADER=stable.h```同时,创建一个stable.h文件,内容例如:```cpp//stable.h#include<QCoreApplication>#include<QDebug>//其他不经常改变的头文件...```步骤2:检查每个源文件确保每个.cpp文件的第一行有效代码是包含stable.h,例如:```cpp#include"stable.h"//其他代码...```步骤3:调整编译器选项(如果需要)如果是MSVC编译器,并且遇到Zm参数问题,则在.pro文件中加入:```win32-msvc*{QMAKE_CXXFLAGS+=-Zm750}```步骤4:清理并重新构建在QtCreator中,选择“构建”->“重新构建项目”。如果问题依旧,请检查QtCreator的编译输出,确定具体的错误信息,以便进一步排查。相关问题:1.Qt预编译头文件的工作原理是什么?2.如何为Qt项目创建预编译头文件?3.为什么在Qt项目中使用预编译头文件可以提高编译速度?4.在Qt中使用预编译头文件有哪些注意事项?5.如何解决预编译头文件与编译器的兼容性问题?</think> ### Qt预编译头文件(PCH)报错解决方案 参考引用内容,Qt预编译头报错的常见原因及解决方案如下: 1. **正确配置.pro文件** 在项目根目录的`.pro`文件中添加: ```qmake CONFIG += precompile_header # 启用预编译 PRECOMPILED_HEADER = stable.h # 指定预编译头文件 ``` 注意`stable.h`需包含所有需要预编译头文件(如Qt核心库)[^1]。 2. **调整内存分配参数(关键步骤)** 在.pro文件末尾添加: ```qmake # 解决Zm参数不兼容问题 QMAKE_CXXFLAGS += -Zm750 # 替代-Zm1000 ``` 引用[1]明确指出Zm1000会导致兼容性问题[^1]。 3. **确保文件包含顺序** 在所有.cpp文件中,**必须**将预编译头文件作为第一个包含: ```cpp // main.cpp #include "stable.h" // 必须是首行 #include "other_header.h" ``` 4. **避免修改预编译头内容** 编译后不要修改`stable.h`内容,否则需重新生成PCH文件(删除`.pch`文件并重新编译)[^3]。 5. **编译器一致性检查** 确保所有文件使用相同编译器标准(C++11/17等),避免C/C++混用导致的版本冲突[^2]。 6. **清理并重建项目** ```bash qmake -B # 重新生成Makefile make clean # 清理旧编译文件 make # 重新编译 ``` 7. **特殊文件处理** 对第三方库文件或自动生成的文件,可在.pro中单独禁用预编译: ```qmake no_pch_sources += special_file.cpp ``` > **注意**:Windows上使用MSVC编译器时,还需确保: > - 安装匹配的Windows SDK版本 > - 检查环境变量`INCLUDE`和`LIB`的路径一致性
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花乾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值