目录
将预编译的头文件添加到您的项目
项目选项
有关可能问题的注意事项
示例项目
预编译头(PCH)是某些编译器支持的性能功能,用于编译稳定的代码体,并将代码的编译状态存储在二进制文件中。 在后续编译期间,编译器将加载存储的状态,并继续编译指定的文件。 由于不需要重新编译稳定的代码,因此每个后续编译都更快。
qmake支持在某些平台和构建环境上使用预编译头,包括:
预编译的头文件必须包含在整个项目中稳定且静态的代码。 典型的预编译头可能如下所示:
// Add C includes here
#if defined __cplusplus
// Add C++ includes here
#include
#include
#include
#include // Qt includes
#include
#include
#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
# include
# include
# include
#endif
myobject.h
#include
class MyObject : public QObject
{
public:
MyObject();
~MyObject();
};
myobject.cpp
#include
#include
#include
#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
#include
#include
#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