Как эффективно использовать предварительно скомпилированные заголовки (используя параметры / Yc и Yu)? - PullRequest
8 голосов
/ 03 марта 2011

Мы используем Visual Studio 2003 (VC71) для компиляции. Чтобы сократить время компиляции, мы изменили сценарий сборки так, чтобы он генерировал файл предварительно скомпилированного заголовка (.pch) для каждого файла CPP.

Опция, используемая в make-файле:

/Yc"StdAfx.h"
/Fp"StdAfx.pch"

При этом время компиляции для цели уменьшилось на 30%. Но может ли кто-нибудь помочь мне понять, как это сокращает время компиляции, даже когда каждый раз генерируется файл pch для компиляции каждого файла CPP.

Кроме того, это правильный подход? Должны ли мы использовать комбинацию Yc и Yu? Я не могу использовать параметр / Yu, так как файл pch должен быть создан хотя бы один раз.

Ответы [ 2 ]

21 голосов
/ 03 марта 2011

Проблема

Допустим, у вас есть список используемых вами заголовков, который, как вы знаете, не изменится.Например, заголовки C, или заголовки C ++, или заголовки Boost и т. Д.

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

Должен быть какой-то способ сообщить компилятору, что эти заголовки всегда одинаковы, и кэшировать их скомпилированный результат, а не перекомпилировать ихснова и снова, нет?

Решение

Предварительно скомпилированные заголовки учитывают это, поэтому все, что вам нужно, это:

  1. Поместить все эти общиеи неизменное включает в себя один файл заголовка (скажем, StdAfx.h)
  2. Иметь один пустой файл CPP (скажем, StdAfx.cpp), включая только этот один файл заголовка

И теперь,вам нужно сообщить компилятору, что StdAfx.cpp - это пустой источник, содержащий общие и неизменные заголовки.

Здесь используются флаги / Yc и / Yu:

  • Скомпилируйте файл StdAfx.cpp с флагом / Yc
  • Скомпилируйте все остальные файлы CPP с флагом / Yu * ​​1026 *

И сгенерирует компилятор (когданеобходимо) предварительно скомпилированный файл заголовка из файла StdAfx.cpp, а затем повторно использовать этот предварительно скомпилированный файл заголовка для всех других файлов, отмеченных /Yu.

Примечание

При созданииновый проект, старые версии Visual C ++ (6 и 2003, если я правильно помню) активируют предварительно скомпилированные заголовки по умолчанию.Последние предлагают выбор их не.

Вы должны создать новый проект VC ++ с активированным PCH, чтобы иметь рабочую версию проекта с поддержкой PCH, и изучить параметры компиляции.

Для получения дополнительной информации о PCH, вы можете посетить следующий URL:

2 голосов
/ 03 марта 2011

/ Yc следует использовать только на одном из ваших модулей .cpp.Это указывает VS на создание предварительно скомпилированного заголовка с этим модулем.

Для всех остальных в вашем проекте используйте / Yu.Это указывает, что они должны просто использовать pch.

Запись MSDN для него находится здесь: http://msdn.microsoft.com/en-us/library/szfdksca(v=VS.71).aspx

...