目錄
将預編譯的頭檔案添加到您的項目
項目選項
有關可能問題的注意事項
示例項目
預編譯頭(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