Начало работы с PCH в проекте VC++

Я работаю над проектом VC++ в VS 2012, который занимает около 8-10 минут для полной компиляции. Я знаю, что PCH может ускорить время компиляции до 10x. В настоящее время я отключил PCH в своем проекте, и я включаю заголовочные файлы, где они необходимы. Как начать работу с PCH? Я везде искал руководства "как", но все, что у меня есть, это документы.

Я предполагаю, что мне надо :

  1. настройте мой проект для PCH, создав пустой заголовок PCH файл
  2. собирать заголовки из каждого .cpp file и поместите его в файл заголовка PCH
  3. изменить каждый файл удаление всех заголовков импорта
  4. перекомпилировать и надеяться, что ничего не пойдет не так;)

Как мне начать с этого (в частности, #1)? Вы изменили проект для использования PCH и каковы его камни преткновения или общие проблемы/проблемы? Может ли PCH вызвать какие-либо проблемы или это просто такое же поведение во время компиляции/выполнения, как обычно включает? Есть ли инструмент для автоматизации процесса или мне нужно пройти через 500 .cpp файлы вручную и изменить его, чтобы использовать PCH?

и последнее, но не менее важное: какое ускорение времени компиляции я могу ожидать с PCH? Это 2x-10x? Или это будет просто на 30% быстрее? (что не оправдывает затраченного времени)

2 ответов


после настройки моего проекта для использования PCH время полной компиляции сократилось до половины, а инкрементные сборки произошли почти мгновенно. PCH-очень эффективный способ ускорить время компиляции, и я настоятельно рекомендую его.

Althouh dsharlet упоминает много важных моментов, он пропускает некоторые важные шаги, которые я должен был в конечном итоге выяснить. Итак, вот полное руководство по настройке вашего проекта для использования PCH:

начало работы с PCH в VC++ проект

  1. резервное копирование src реж и любые другие каталоги, содержащие исходный код ... (вам понадобится это, если что-то пойдет не так)

  2. создайте 2 файла в своем проекте,Globals.cpp и Globals.h .. (выберите любое имя, но придерживаться его)

  3. щелкните правой кнопкой мыши Globals.cpp и открытым свойства выберите конфигурацию > все конфигурации

  4. перейти к C | C++ / предварительно скомпилированный заголовок и заполните их:

    • Предкомпилированного Заголовка: Create (/Yc)
    • Предварительно Скомпилированный Файл Заголовка : глобалы.h
  5. открыть Globals.cpp и добавьте эту строку В, и ничего: #include "Globals.h"

  6. щелкните правой кнопкой мыши проект VC++ и откройте свойства выберите конфигурацию > все конфигурации

  7. перейдите к заголовку C | C++ / Precompiled и заполните их:

    • Предкомпилированного Заголовка: Использовать (/Yu)
    • Предварительно Скомпилированный Файл Заголовка : глобалы.h
  8. открыть все .h и .cpp файлы в вашем проекте, и добавьте это в самом верху:#include "Globals.h"

  9. открыть 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>
    
    • это включает в себя типичные кандидаты для вашего файла PCH
    • удалить включает, что вы не используете
    • пройдите через свой проект и соберите больше заголовочных файлов, которые не часто меняют
  10. используя find и replace, найдите каждый из #includeв вашем файле PCH и удалите их из всех .h и .cpp файлы в проекте.

  11. выполните полную компиляцию и убедитесь, что все работает нормально. Вот некоторые решения для общих проблем, с которыми вы столкнетесь:


PCH файл включает в себя:

ваш PCH-файл включает заголовок, который снова включает файл заголовка PCH, создавая своего рода круговую зависимость. Дважды щелкните ошибку, чтобы перейти к файлу-нарушителю, и просто удалите строку, в которой говорится #include "Globals.h"


неопределенный символ X

хотя все ваши файлы проекта могут включать заголовок PCH, включенные файлы внутри заголовок PCH не может включать заголовок PCH! (как указано выше) таким образом, вам нужно будет добавить обратно любые импорта, которые были ранее в файле. (diff файл с резервной версией)


не удается найти символ logf

иногда глобальный файл PCH не так, как ожидалось, и ломает компиляцию с сумасшедшими ошибками, которые невозможно решить. Затем можно отключить PCH для отдельных файлов исходного кода.

  1. щелкните правой кнопкой мыши .cpp файл и открыть свойства выберите конфигурацию > все конфигурации

  2. перейдите к заголовку C | C++ / Precompiled и заполните их:

    • Предкомпилированного Заголовка : Не Используется Предварительно Скомпилированные Заголовки
  3. удалить строку #include "Globals.h" в своем

  4. добавить туда все, что импортирует файл изначально. (diff файл с резервной версией)


вот как я использую PCH с достойными результатами:

  1. перейти к проект properties, C / C++ / PCH установите опцию предварительно скомпилированного заголовка в "Use". Установите предварительно скомпилированный файл заголовка на то, что вы хотите.
  2. перейдите к свойствам файла cpp, который вы хотите быть PCH, и установите параметр предварительно скомпилированного заголовка В "создать" (по умолчанию он будет "использовать" из параметра свойства проекта).
  3. включите заголовок pch во все ваши cpp-файлы в проекте (в основном, те, которые имеют "использовать" набор для опции предварительно скомпилированного заголовка). Я полагаю, вы могли бы отключить "использование" для некоторых файлов cpp в проекте вместо добавления включения для PCH, но я никогда не пробовал это...

на данный момент проект должен по-прежнему строить и вести себя точно так же, как раньше, но не может быть никакого реального улучшения во время компиляции. Теперь вам нужно двигаться некоторые вашего #include "...h " в файл заголовка PCH (и удалите includes из этих файлов из других частей проекта). Включает в себя, что вы должны перейти к заголовку PCH должны быть заголовки, которые включена во многие файлы, а нечасто изменить. Примеры: заголовки STL, windows.H, заголовки основных функций из вашего проекта и т. д.

Как только PCH настроен, он должен быть прозрачным. Это в основном просто помогает компилятору кэшировать некоторые промежуточные данные компиляции. Другими словами, если вы отключили PCH в своем проекте, все должно по-прежнему строиться точно так же, как и при включении PCH (за исключением медленнее!)

ускорение полностью зависит от того, сколько кода перемещается в PCH (сколько включенного кода из заголовков перемещается из произвольных файлов cpp в заголовок PCH). Я видел несколько раз улучшение, но не сравнивал его точно. Я определенно чувствовал, что это стоит сделать, когда я прошел через проблемы с использованием PCH в большом проекте.