paip.提升用户体验----gcc c++ 编译速度提升by预编译头技术 .doc

时间:2022-10-12 09:35:31

paip.提升用户体验----gcc c++ 编译速度提升by预编译头技术  .doc

 

作者Attilax ,  EMAIL:1466519819@qq.com 

来源:attilax的专栏

地址:http://blog.csdn.net/attilax

 

 

预编译头技术 1

标准情况编译情况: 1

建立公共头文件.AtiH.H 2

预编译头为gch文件 2

测试使用gch文件的情况,提高20倍速度 3

添加参数-Winvalid-pch 4

 

 

预编译头技术

///////////////////////////////////////////////////

所谓预编译头,就是把头文件事先编译成一种二进制的中间格式,供后续的编译过程使用。

——预编译头技术节省时间的原理正在于此,尤其是在这样一个事实下:对源代码的“解析”这个步骤,确实是占了编译时间中 很可观的一部分。

预编译头文件是将一些项目中普遍使用的头文件内容的词法分析、语法分析等结 果缓存在一个特定格式的二进制文件中;当然编译实质 C/C++ 源文件时,就不必从头对这些头文件进行词法-语法分析,而只需要利用那些已经完成词法-语法分析的结果就可以了。

 

事实上,GCC 从 3.4.x 版和 4.x 版开始,也支持了这种提高编译效率的机制。只是由于 GNU CC 的手册 中的《Using Precompiled Headers》一节对此介绍不多,也没有简单的自动项目管理工具支持这项功能,因而许多网友还不知道 GNU CC 的这项功能。

 

可以大大节省时间. ...大部分情况哈,可以减少95%的编译时间..速度提升几十倍.

 

 

标准情况编译情况:

////////////////////////////////////////////////////////////////////

 

我们来看看结果。写一个C++Hello world,使用cout输出一行字。包含了什么头文件?当然是iostream。这个头文件对于人们来说,绝对是熟视无睹级别的。然而使用它的时候,你 注意到编译器幕后的累累“罪行”了吗?是的,用 -H 参数编译一下这个Hello world吧!看看总共加载了多少个头文件?我的机器上,总共103个!

我的main.cpp比较复杂,编译了哈,竟然加载了1600多个文件...

建立公共头文件.AtiH.H

////////////////////////////////////////////////////////////////////////////////

不个常用的头文件提取出来..

#ifndef ATIH_H

#define ATIH_H

#include    <assert.h>

#include    <QApplication>

#include    <qfile.h>

#include    <QMainWindow>

#include    <QObject>

#include    <qstring.h>

#include    <QtCore>

#include    <qtextcodec.h>

#include    <qtextstream.h>

#include    <QtWebKitWidgets>

#include    <QtWidgets>

#include    <QWebFrame>

#include    <QWebView>

#include  <QtCore/QVariant>

#include<QtCore/QVariant>

#endif//ATIH_H

 

其他文件include这个文件AtiH.H..最好放得个最前头..

预编译头为gch文件

/////////////////////////////////////////////////////

是的,你应该将它们做成一个.gch文件。如何做?如前所述,再简单不过:只要编译它就可以了:

g++ xxx.h

做成bat文件加载...

cd D:\qtworkspace\build-qqMicro-Desktop_Qt_5_1_1_mingw_cplus-Debug

g++   -pipe -fno-keep-inline-dllexport -w -H -Winvalid-pch -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_WEBKITWIDGETS_LIB -DQT_QUICK_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_OPENGL_LIB -DQT_PRINTSUPPORT_LIB -DQT_WEBKIT_LIB -DQT_QML_LIB -DQT_MULTIMEDIA_LIB -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_SENSORS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I..\qqMicro -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtWebKitWidgets" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtQuick" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtMultimediaWidgets" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtOpenGL" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtPrintSupport" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtWebKit" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtQml" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtMultimedia" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtWidgets" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtNetwork" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtSensors" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtGui" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtCore" -I"debug" -I"." -I"." -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\mkspecs\win32-g++" ..\qqMicro\atih.h

 

最后生成atiH.h.gch..竟然有131M尺寸...这么大阿..

测试使用gch文件的情况,提高20倍速度

///////////////////////////////////////////////////////////////////////////////////

果然,速度的飞快,原来需要1分钟编译,,,而个只要3秒中...

 

添加参数-Winvalid-pch

////////////////////////////////////////////

如 果.gch不可用,编译器会给出一条警告,告诉我们:这个预编译头不能

 Warn about PCH files that are found but not used

 

参考:

浅谈GCC预编译头技术 - wallwind的专栏 博客频道 - CSDN.NET.htm

[转载]GCC使用预编译头文件_panp_新浪博客.htm