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

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

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

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

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

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

7

Решение

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

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

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

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

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

  3. Щелкните правой кнопкой мыши Globals.cpp и открыть свойства, выберите Конфигурация> Все конфигурации

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

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

  6. Щелкните правой кнопкой мыши ваш проект VC ++ и откройте свойства, выберите Конфигурация> Все конфигурации

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

    • Предварительно скомпилированный заголовок : Используйте (/ Yu)
    • Предварительно скомпилированный заголовочный файл : Globals.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. Используя поиск и замену, найдите каждый из #includeв вашем файле PCH, и удалите их из всех .h а также .cpp файлы в вашем проекте.

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


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

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


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

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


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

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

  1. Щелкните правой кнопкой мыши на вашем .cpp файл и открыть свойства, выберите Конфигурация> Все конфигурации

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

    • Предварительно скомпилированный заголовок : Не использовать предварительно скомпилированные заголовки
  3. Удалить строку #include "Globals.h" в вашем .cpp файл

  4. Добавьте обратно все, что импортировал файл изначально. (отличается файл с версией резервной копии)

7

Другие решения

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

  1. Перейти к проект свойства, C / C ++ | PCH устанавливают для параметра Precompiled Header значение «Use». Установите файл скомпилированного заголовка на то, что вы хотите.
  2. Перейдите к свойствам файла cpp, которым вы хотите стать PCH, и установите для параметра «Предварительно скомпилированный заголовок» значение «Создать» (по умолчанию для него задано значение «Использовать» в параметре свойства проекта).
  3. Включите заголовок pch во все ваши файлы cpp в проекте (в основном те, в которых для параметра «Скомпилированный заголовок» установлено «Использовать»). Я полагаю, вы могли бы отключить «Использовать» для некоторых файлов cpp в проекте вместо добавления включения для PCH, но я никогда не пробовал это …

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

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

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

1

По вопросам рекламы [email protected]