zoukankan      html  css  js  c++  java
  • 提高Qt Creator编译速度的7种方法,亲测可行(★firecat推荐★)

    本篇参考了知乎文章https://www.zhihu.com/question/23045749,然后个人精心整理而来,Windows用户请重点关注方法7,效果立竿见影!

    通常大家会认为Qt Creator的编译速度太慢,太耗时间。容易让人产生误会,即“用Qt写的程序编译比MFC慢”。其实这个说法是错误的。首先,Qt creator只是一个IDE,不是编译器,编译快慢与Qt Creator无关,要看具体使用的是什么编译器和编程方法。
    事实上,单位代码行数编译Qt远比MFC快得多,因为Qt库的头文件设计非常好,尽量都使用了前置声明,避免了头文件嵌套,几乎所有类都使用了公有类和私有类的设计,把没必要公开的声明放到私有头文件里,避免了编译时引入过多代码。而MFC没有这样的设计。至于大家感觉MFC快主要原因是MFC工程默认打开了编译预处理头文件(PCH),但是这不仅仅是VC编译器的特性,所有C++程序都可以用,不是MFC特有,Qt也可以使用 PCH。

    方法1:工程.pro文件加入预编译机制,PRECOMPILED_HEADER

    详情见官网介绍:

    https://doc.qt.io/qt-5/qmake-precompiledheaders.html

    https://doc.qt.io/qt-5/qmake-variable-reference.html#config

    Qt安装路径也有具体的示例,例如笔者的路径是D:QtQt5.9.8ExamplesQt-5.9.8qmakeprecompile

    下面我们说说使用方法,添加预编译头文件(PCH,PreCompiled Headers)支持,在pro文件添加下面代码:

    1.  
      # Use Precompiled headers (PCH)
    2.  
      CONFIG += precompile_header
    3.  
      PRECOMPILED_HEADER = stable.h
    4.  
      # HEADERS += stable.h #这句话是可有可无的,建议加上

    预编译头文件stable.h包含哪些内容?预编译头文件应该将稳定和静态(例如,Qt库头文件、第三方库头文件、自定义的不经常改动的头文件)的代码包含在你工程中。一个典型的PCH文件类似如下:

    1.  
      // #ifndef STABLE_H //Qt官方例子没有定义这个条件编译
    2.  
      // #define STABLE_H
    3.  
       
    4.  
      // Add C includes here
    5.  
      #include <iostream>
    6.  
       
    7.  
      #if defined __cplusplus
    8.  
      // Add C++ includes here
    9.  
      #include <vector>
    10.  
       
    11.  
      // Qt includes
    12.  
      #include <QApplication>
    13.  
      // #include <QtCore> //请谨慎包含
    14.  
      // #include <QtGui> //请谨慎包含
    15.  
      #include <QObject>
    16.  
      #include <qglobal.h>
    17.  
      #include <QDir>
    18.  
      #include <QIntValidator>
    19.  
      #include <QToolTip>
    20.  
      #include <QDebug>
    21.  
      #include <QMainWindow>
    22.  
      #include <QDialog>
    23.  
      #include <QFileDialog>
    24.  
      #include <QPushButton>
    25.  
      #include <QLabel>
    26.  
      #include <QLineEdit>
    27.  
      #include <QTimer>
    28.  
      #include <QtNetwork>
    29.  
      #include <QTextCodec>
    30.  
      #include <QThread>
    31.  
      #include <QtSql>
    32.  
      #if (QT_VERSION > QT_VERSION_CHECK(5,0,0))
    33.  
      #include <QtWidgets>
    34.  
      #endif
    35.  
       
    36.  
      #include <QGraphicsScene>
    37.  
      #include <QGraphicsItem>
    38.  
      #include <QGraphicsPixmapItem>
    39.  
      #include <QGraphicsSceneWheelEvent>
    40.  
       
    41.  
      // Other
    42.  
      #include "thirdparty/include/libmain.h"
    43.  
      #include "my_stable_class.h"
    44.  
      ...
    45.  
      #endif //__cplusplus
    46.  
      // #endif // STABLE_H

    注意:

    1、如果可以的话,请尽量不要#include <QtCore>和#include <QtGui>,因为这两个头文件涵盖了Qt所有的类,处理他们需要的时间相当长。

    2、官方文档说,预编译头文件要将C和C++头文件分开,所以使用了#if defined __cplusplus

    3、我发现Qt官方自带的案例https://github.com/qt/qtbase/blob/5.12/examples/qmake/precompile/stable.h (在本地安装路径也有ExamplesQt-5.9.8qmakeprecompile),以及Qt Creator的源码https://github.com/qt-creator/qt-creator/blob/master/src/shared/qtcreator_pch.h

    都没有使用“防止头文件重复包含”的宏定义:言外之意,预编译头文件允许重复包含了?有待确认..fixme..

    1.  
      #ifndef STABLE_H
    2.  
      #define STABLE_H
    3.  
       
    4.  
      #endif

    在.pro文件添加预编译信息之后,qmake将会处理剩下的工作——确保创建和使用预编译头文件。你不需要在.pro文件包含预编译头文件到HEADERS变量中,如果配置了支持PCH,qmake会帮助你完成这些。

    # HEADERS += stable.h #这句话是可有可无的,建议加上

    如果是VC++编译器,最终会生成{projectname}_pch.pch文件,大约几十或上百M的预编译头文件。

    如果是MinGW编译器,最终会生成stable.h.gch文件夹,里面有个C++文件,大约几十或上百M的预编译头文件。

    未开启Qt的预编译头文件功能时,项目一旦工程数目众多,每个工程中又有很多文件时,每个头文件交叉包含Qt的头文件、第三方头文件、自定义的头文件。一旦启动编译,过程是漫长又痛苦的!

    开启Qt预编译头文件后,同样的项目编译下来不需要漫长的等待时间,项目即可编译完成。与未使用预编译头文件之前相比,速度上快了10倍以上!

    4、更详细的.pro文件的配置,请参见我的另一篇博客

    Qt Creator指定临时文件生成目录(MOC_DIR/RCC_DIR等)和配置.pro文件

    方法2:启动多核编译

    1、如果是VS的MSVC编译器,可以在 .pro里加入下面一行

    QMAKE_CXXFLAGS += /MP

    指定/mp编译选项,编译器将使用并行编译,同时起多个编译进程并行编译不同的cpp。
    2、如果是MinGW编译器:

    项目-》构建设置-》构建步骤-》make详情-》make参数 ,填入-j4,之后编译就飕飕的了,如果处理器八个核填-j8。

    笔者注:本人发现Qt Creator 4.8.2 (Enterprise)版本已经默认启动了多核编译,无需自己手动设置了。(#^.^#)

    方法3:添加-r参数(仅针对MinGW有效,VC++无效)

    QtCreator在windows下用Mingw编译的时候,在正式开始编译前,会卡一段时间,大概10s左右的样子,所以对小工程就可能造成编译速度慢的假象,如果是这个情况,你需要在make和clean的参数选项前加个 “-r” ,这样就会直接开始编译工作,速度马上就会快很多了。

    方法4:头文件包含,尽量用类的前置声明代替#include

    例如,头文件include <class_> 改成 class class_

    详情参见我的另一篇博客:https://blog.csdn.net/libaineu2004/article/details/89207060

    方法5:Windows用户请采用Visual Studio的msvc编译器,而不是MinGW的gcc编译器。前者比后者编译速度更快。

    一般来说Windows下就是MinGW的gcc和Visual Studio的nmake,在Windows下推荐使用MSVC编译器,能够加快编译速度。

    MinGW,其实它就是一个移植版本的GCC,的确是不如VC++快的。如果是其它平台,那么编译器可以换成LLVM的clang,那就快很多了。同样的源码,在MacOS编译比Windows要快得多,因为MacOS使用的就是Clang编译器。

    所以结论:在Windows平台还是尽量用MSVC编译器!另外,有经济条件的话,建议使用MacOS开发,编译快。

    方法6:关闭360杀毒防护软件的实时扫描功能,或者启用开发者模式,信任编译输出路径。

    方法7:Windows用户可以使用第三方插件,IncrediBuild for Qt Creator

    详情参见我的另一篇博客:《提高Qt Creator编译速度的7种方法の扩展篇:IncrediBuild v9.x使用详解,与Qt Creator v4.10搭配提速

    其他方法:比如有经济条件的话,使用固态硬盘,这对提升编译速度也很明显。

    -------------------------------------------------------附录-------------------------------------------------------------

    题外话:

    1、解决windowsvc++编译器qDebug()等中文乱码问题,可以在stable.h中添加:

    1.  
      #if defined(_MSC_VER) && (_MSC_VER >= 1600)
    2.  
      # pragma execution_character_set("utf-8")
    3.  
      #endif

    或者

    1.  
      #ifdef _MSC_VER
    2.  
      #if _MSC_VER >= 1600
    3.  
      #pragma execution_character_set("utf-8")
    4.  
      #pragma warning (disable:4819)
    5.  
      #endif // _MSC_VER >= 1600
    6.  
      #endif // _MSC_VER

    注意: Qt Creator -> Options -> Text Editor -> Behavior -> File Encodings 更改设置为 "UTF-8",BOM设置为"Add If Encoding Is UTF-8",如果编码是UTF-8则添加。

    2、场景证明

    情景一:今天在使用Qt设计界面的时候发现的一个问题,每修改一处代码,就要清理工程、重新构建才可以看到最新的效果

    项目文件少还好,文件多了,每修改一下就要重新构建一次,特别浪费时间!

    情景二:由于vc2013开始可以使用"#pragma execution_character_set("UTF-8")"来解决UTF-8编码问题,可是这句话放哪里呢?网上查一查,清一色的都说放在main函数前面,好吧,我放了,但是发现还是会存在乱码的问题。其实网上那些朋友搞错了一个概念,这个命令是在编译时产生作用的,而不是运行时,你放main函数前面根本就没用!你要放在编译器编译的第一个文件中头部,但是问题是你不确定编译器到底从哪个文件开始编译。。。

    基于以上两个不便之处,预编译头文件的作用就显现出来了!

    3、笔者发现小问题

    使用环境是Qt Creator 4.8.2+MSVC2015编译器,编译工程时,有时.pch文件会生成在当前构建目录下,名字是{projectname}_pch.pch;有时会生成在C:Users<用户名>AppDataLocalTemp,而且名字是随机的。奇怪了。。囧

    4、VC++预编译头文件 – stdafx.h的作用是什么?

    https://blog.csdn.net/libaineu2004/article/details/91428595

    5、Qt Creator断点调试慢?

    IDE菜单->工具->选项->构建和运行,在部署项目前总是先构建&在运行项目前总是先部署,这两栏去掉勾选再试试。

    6、C++库大全

    https://github.com/fffaraz/awesome-cpp

    转发:https://libaineu2004.blog.csdn.net/article/details/89352224

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/linyinmobayu/p/13998275.html
Copyright © 2011-2022 走看看