提高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:\Qt\Qt5.9.8\Examples\Qt-5.9.8\qmake\precompile

下面我們說說使用方法,添加預編譯頭文件(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 (在本地安裝路徑也有\Examples\Qt-5.9.8\qmake\precompile),以及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\<用戶名>\AppData\Local\Temp,而且名字是隨機的。奇怪了。。囧

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM