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文件。 您可以在“编辑”模式下查看代码。 

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
发布了24 篇原创文章 · 获赞 0 · 访问量 3213

猜你喜欢

转载自blog.csdn.net/xuyouqiang1987/article/details/104085890