Я работаю над проектом VC ++ в VS 2012, на компиляцию которого уходит около 8-10 минут. Я знаю, что PCH может ускорить время компиляции до 10 раз. В настоящее время я отключил PCH в своем проекте и включаю заголовочные файлы там, где они нужны. Как начать работать с PCH? Я искал повсюду руководства «как делать», но все, что я получил, это документы.
Я предполагаю, что мне придется:
.cpp
файл и поместите его в файл заголовка PCHКак мне начать с этим (конкретно # 1)? Изменили ли вы проект для использования PCH, и в чем заключаются камни преткновения или общие проблемы / проблемы? Может ли PCH вызывать какие-либо проблемы, или это то же поведение во время компиляции / времени выполнения, что и в обычном режиме? Есть ли инструмент для автоматизации процесса или мне нужно вручную пройти 500 файлов .cpp и изменить его для использования PCH?
И последнее, но не менее важное: какое ускорение компиляции я могу ожидать с PCH? Это 2x-10x? Или это будет на 30% быстрее? (что не оправдывает затраченное время)
После настройки моего проекта на использование PCH время полной компиляции сократилось вдвое, а инкрементные сборки происходили практически мгновенно. PCH — очень эффективный способ ускорить время компиляции, и я очень рекомендую его.
Althouh dsharlet упоминает много важных моментов, он пропускает некоторые важные шаги, которые мне пришлось со временем выяснить. Итак, вот полное руководство по настройке вашего проекта для использования PCH:
Сделайте резервную копию вашего src
dir и любые другие каталоги, которые содержат исходный код … (он понадобится вам на случай, если что-то пойдет не так)
Создайте 2 файла в своем проекте, Globals.cpp
а также Globals.h
.. (выберите любое имя, но придерживайтесь его)
Щелкните правой кнопкой мыши Globals.cpp
и открыть свойства, выберите Конфигурация> Все конфигурации
Перейти к C / C ++ | Предварительно скомпилированный заголовок и заполните их:
открыто Globals.cpp
и добавить эту одну строку, и ничего более: #include "Globals.h"
Щелкните правой кнопкой мыши ваш проект VC ++ и откройте свойства, выберите Конфигурация> Все конфигурации
Перейти к C / C ++ | Предварительно скомпилированный заголовок и заполните их:
Откройте все .h
а также .cpp
файлы в вашем проекте, и добавьте это в самом верху: #include "Globals.h"
открыто Globals.h
и добавьте следующее в: (это очень важно, у вас есть #pragma once
на вершине)
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
#include <memory>
#include <string.h>
#include <limits.h>
#include <float.h>
#include <time.h>
#include <ctype.h>
#include <wchar.h>
#include <wctype.h>
#include <malloc.h>
#include <locale.h>
#include <math.h>
// Windows SDK
#define _WIN32_WINNT 0x0501 // _WIN32_WINNT_WINXP
#include <SDKDDKVer.h>
// Windows API
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
Используя поиск и замену, найдите каждый из #include
в вашем файле PCH, и удалите их из всех .h
а также .cpp
файлы в вашем проекте.
Сделайте полную компиляцию и убедитесь, что все работает хорошо. Вот несколько решений для общих проблем, с которыми вы столкнетесь:
Файл PCH включает в себя:
Ваш файл PCH включает заголовок, который снова включает файл заголовка PCH, создавая некую циклическую зависимость. Дважды щелкните по ошибке, чтобы перейти к файлу-нарушителю, и просто удалите строку с надписью #include "Globals.h"
Неопределенный символ X
Хотя все файлы вашего проекта могут включать заголовок PCH, файлы включены внутри заголовок PCH не может включать заголовок PCH! (как указано выше), поэтому вам нужно будет добавить обратно любой импорт, который был ранее в файле. (отличается файл с версией резервной копии)
Не удается найти символ logf
Иногда глобальный файл PCH ведет себя не так, как ожидалось, и нарушает компиляцию из-за сумасшедших ошибок, которые невозможно устранить. Затем вы можете отключить PCH для отдельных файлов исходного кода.
Щелкните правой кнопкой мыши на вашем .cpp
файл и открыть свойства, выберите Конфигурация> Все конфигурации
Перейти к C / C ++ | Предварительно скомпилированный заголовок и заполните их:
Удалить строку #include "Globals.h"
в вашем .cpp
файл
Добавьте обратно все, что импортировал файл изначально. (отличается файл с версией резервной копии)
Вот как я использую PCH с приличными результатами:
На этом этапе проект должен по-прежнему создаваться и вести себя точно так, как раньше, но реального времени компиляции может и не быть. Теперь вам нужно двигаться немного вашего #include «… h» в файл заголовка PCH (и удалите включения этих файлов из других частей проекта). Включает, что вы должны перейти к заголовку PCH должны быть заголовки, которые включено во многие файлы, но меняются нечасто. Примеры: заголовки STL, windows.h, заголовки основных функций вашего проекта и т. Д.
Как только PCH настроен, он должен быть прозрачным. Это в основном просто помогает компилятору кэшировать некоторые промежуточные данные компиляции. Другими словами, если вы отключили PCH в своем проекте, все должно работать точно так же, как если бы PCH был включен (кроме медленного!)
Ускорение полностью зависит от того, сколько кода перемещено в PCH (сколько включенного кода из заголовков перемещается из произвольных файлов cpp в заголовок PCH). Я видел многократное улучшение, но не оценил его точно. Я определенно чувствовал, что это стоило сделать, когда у меня были проблемы с использованием PCH в большом проекте.