天天看點

qmake 3.1(Qt 5.14.0使用)使用者手冊8——使用預編譯頭将預編譯的頭檔案添加到您的項目有關可能問題的注意事項示例項目

目錄

将預編譯的頭檔案添加到您的項目

項目選項

有關可能問題的注意事項

示例項目

預編譯頭(PCH)是某些編譯器支援的性能功能,用于編譯穩定的代碼體,并将代碼的編譯狀态存儲在二進制檔案中。 在後續編譯期間,編譯器将加載存儲的狀态,并繼續編譯指定的檔案。 由于不需要重新編譯穩定的代碼,是以每個後續編譯都更快。

qmake支援在某些平台和建構環境上使用預編譯頭,包括:

  • Windows
    • nmake
    • Visual Studio projects (VS 2008 and later)
  • macOS, iOS, tvOS, and watchOS
    • Makefile
    • Xcode
  • Unix
    • GCC 3.4 and above
    • clang 

将預編譯的頭檔案添加到您的項目

預編譯的頭檔案必須包含在整個項目中穩定且靜态的代碼。 典型的預編譯頭可能如下所示:

// Add C includes here

  #if defined __cplusplus
  // Add C++ includes here
  #include <stdlib>
  #include <iostream>
  #include <vector>
  #include <QApplication> // Qt includes
  #include <QPushButton>
  #include <QLabel>
  #include "thirdparty/include/libmain.h"
  #include "my_stable_class.h"
  ...
  #endif
           

注意:由于C檔案的預編譯頭檔案可能不包含C++代碼,是以預編譯的頭檔案需要将C include和C ++ include分開。

項目選項

要使您的項目使用預編譯頭,隻需在項目檔案中定義PRECOMPILED_HEADER變量:

  PRECOMPILED_HEADER = stable.h
           

qmake将處理其餘部分,以確定建立和使用預編譯的頭檔案。 您不需要在HEADERS中包含預編譯的頭檔案,因為如果配置支援預編譯的頭,則qmake會這樣做。

預設情況下,針對Windows的MSVC和g++規範啟用precompile_header。

使用此選項,可以在使用預編譯頭時觸發項目檔案中的條件塊以添加設定。 例如:

  precompile_header:!isEmpty(PRECOMPILED_HEADER) {
  DEFINES += USING_PCH
  }
           

要對MSVC nmake目标上的C檔案也使用預編譯的頭檔案,請将precompile_header_c添加到CONFIG變量中。 如果頭檔案也用于C++,并且包含C++關鍵字/包含,請使用#ifdef __cplusplus括起來。

有關可能問題的注意事項

在某些平台上,預編譯頭檔案的檔案名字尾與其他目标檔案的字尾相同。 例如,以下聲明可能會導緻生成兩個具有相同名稱的不同目标檔案:

  PRECOMPILED_HEADER = window.h
  SOURCES            = window.cpp
           

為避免此類潛在沖突,請為将要預編譯的頭檔案指定唯一的名稱。

示例項目

您可以在Qt Release版的examples/qmake/precompile目錄中找到以下源代碼:

mydialog.ui
           

下圖以Qt Creator設計模式顯示mydialog.ui檔案。 您可以在“編輯”模式下檢視代碼。 

qmake 3.1(Qt 5.14.0使用)使用者手冊8——使用預編譯頭将預編譯的頭檔案添加到您的項目有關可能問題的注意事項示例項目
stable.h

  /* Add C includes here */

  #if defined __cplusplus
  /* Add C++ includes here */

  # include <iostream>
  # include <QApplication>
  # include <QPushButton>
  # include <QLabel>
  #endif
           
 myobject.h

  #include <QObject>

  class MyObject : public QObject
  {
  public:
      MyObject();
      ~MyObject();
  };
           
myobject.cpp

  #include <iostream>
  #include <QDebug>
  #include <QObject>
  #include "myobject.h"

  MyObject::MyObject()
      : QObject()
  {
      std::cout << "MyObject::MyObject()\n";
  }
           
util.cpp

  void util_function_does_nothing()
  {
      // Nothing here...
      int x = 0;
      ++x;
  }
           
main.cpp

  #include <QApplication>
  #include <QPushButton>
  #include <QLabel>
  #include "myobject.h"
  #include "mydialog.h"

  int main(int argc, char **argv)
  {
      QApplication app(argc, argv);

      MyObject obj;
      MyDialog dialog;

      dialog.connect(dialog.aButton, SIGNAL(clicked()), SLOT(close()));
      dialog.show();

      return app.exec();
  }
           
precompile.pro

  TEMPLATE  = app
  LANGUAGE  = C++
  CONFIG   += cmdline precompile_header

  # Use Precompiled headers (PCH)
  PRECOMPILED_HEADER  = stable.h

  HEADERS   = stable.h \
              mydialog.h \
              myobject.h
  SOURCES   = main.cpp \
              mydialog.cpp \
              myobject.cpp \
              util.cpp
  FORMS     = mydialog.ui
           

繼續閱讀