paip.提升用户体验----gcc c++ 编译速度提升by预编译头技术 .doc
作者Attilax , EMAIL:1466519819@qq.com
来源:attilax的专栏
地址:http://blog.csdn.net/attilax
预编译头技术
///////////////////////////////////////////////////
所谓预编译头,就是把头文件事先编译成一种二进制的中间格式,供后续的编译过程使用。
——预编译头技术节省时间的原理正在于此,尤其是在这样一个事实下:对源代码的“解析”这个步骤,确实是占了编译时间中 很可观的一部分。
预编译头文件是将一些项目中普遍使用的头文件内容的词法分析、语法分析等结 果缓存在一个特定格式的二进制文件中;当然编译实质 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