Visual studio как отключить предварительно скомпилированные заголовки
First of all i want to say that I read about precompiled headers and I understand that this is an optimization that saves me the time of compiling headers over and over on every built.
I'm reading the documentation of boost and I see that in the instructions they say:
In Configuration Properties > C/C++ > Precompiled Headers, change Use Precompiled Header (/Yu) to Not Using Precompiled Headers
And then they explain it:
There's no problem using Boost with precompiled headers; these instructions merely avoid precompiled headers because it would require Visual Studio-specific changes to the source code used in the examples.
its their way of saying the samples don't follow the mantra of a unified use-this-lead-in-header-for-pch-generation model. IOW, their samples aren't PCH-friendly, but you can still use pch with boost in your projects if properly configured correctly.
@user2485710: "Need"? No, of course not. Do you need your luxury car? That holiday you took last year? You said you "need" an IDE to "make everything work", not to make things easier for you.
3 Answers 3
Originally a comment, but I may as well post it. Note: this is specific to VC++:
The bold sentence is their way of saying the samples don't follow the mantra of a unified use-this-lead-in-header-for-pch-generation model. IOW, their samples aren't PCH-friendly, but you can still use pch with boost in your projects if properly configured.
You would turn them off for a variety of reasons. Some source modules, particularly ones from 3rd-parties, don't follow the PCH model of including "the" pch-through-header at their outset. Their samples are such code (and thus the advise to turn them off for their samples). Sometimes source files require different preprocessor configurations only for this files and not all files int he project; another reason to disable PCH for those files.
You typically use a source/header pair to generate "the One"; the precompiled header image. This header file typically includes:
- Any system standard lib headers used by your project
- 3rd-party SDK headers
- Just about everything else that is NOT in active development for your project.
In short (hard to believe), is telling you their samples aren't setup like described above, and as such you should turn PCH off when building them.
When you use pre-compiled headers, you need to do something like:
There's a little more to the story than just that though. To make pre-compiled headers work well, you want to include exactly the same set of headers in exactly the same order in every source file.
This means each source file typically includes a lot of headers it doesn't actually need. That, in turn, means that if you don't use pre-compiled headers, you end up with compilation that's much slower than if you hadn't done anything to support pre-compiled headers at all.
При создании проекта в Visual Studio в pch.h проект добавляется предварительно скомпилированный файл заголовка. (В Visual Studio 2017 и более ранних версиях файл был вызван stdafx.h .) Цель файла — ускорить процесс сборки. Здесь следует включить любые стабильные файлы заголовков, например заголовки стандартной библиотеки, такие как . Предкомпилированный заголовок компилируется только в том случае, если он или какие-либо содержащиеся в нем файлы были изменены. Если изменения вносятся только в исходный код проекта, при сборке будет пропущена компиляция для предкомпилированного заголовка.
Параметры компилятора для предварительно скомпилированных заголовков. /Y На страницах свойств проекта параметры находятся в разделе Configuration PropertiesC>/C++>Precompiled Headers. Можно не использовать предкомпилированные заголовки, а также указать имя файла заголовка и путь к выходному файлу.
Настраиваемый предварительно скомпилированный код
Для больших проектов, для которых требуется значительное время, может потребоваться создать настраиваемые предварительно скомпилированные файлы. Компиляторы Microsoft C и C++ содержат параметры для предварительной компиляции любого кода C или C++, включая встроенный код. С помощью этой функции производительности можно скомпилировать стабильный текст кода, сохранить скомпилированное состояние кода в файле и во время последующих компиляций объединить предварительно скомпилированный код с кодом, который все еще находится в стадии разработки. Каждая более поздняя компиляция выполняется быстрее, так как стабильный код не требует повторной компиляции.
Когда следует предварительно скомпилировать исходный код
Предварительно скомпилированный код полезен во время цикла разработки, чтобы сократить время компиляции, особенно если:
Всегда используется большой текст кода, в который редко вносятся изменения.
Программа состоит из нескольких модулей, каждый из которых использует стандартный набор включаемых файлов, а также одни и те же параметры компиляции. В этом случае все включаемые файлы можно предварительно скомпилировать в один предкомпилированный заголовок.
Первая компиляция (которая создает предварительно скомпилированный файл заголовка) занимает немного больше времени, чем последующие компиляции. Последующие компиляции могут выполняться быстрее, включая предварительно скомпилированный код.
Можно предварительно скомпилировать программы C и C++. В программировании на C++ часто используется разделение сведений об интерфейсе класса на файлы заголовков. Впоследствии эти файлы заголовков можно будет включать в программы, использующие класс. Предварительная компиляция этих заголовков позволяет сократить время, затрачиваемое программой на компиляцию.
Несмотря на то, что для каждого исходного файла можно использовать только один предварительно скомпилированный заголовок ( .pch файл), в проекте можно использовать несколько .pch файлов.
Два варианта для предварительной компиляции кода
Вы можете предварительно скомпилировать любой код C или C++; Вы не ограничиваетесь предварительной компиляцией только файлов заголовков.
Для предварительной компиляции требуется планирование, но при предварительной компиляции исходного кода, отличного от простых файлов заголовков, обеспечивается значительно более быстрая компиляция.
Предварительная компиляция кода рекомендуется, когда известно, что исходные файлы используют общие наборы файлов заголовков, но не содержат их в том же порядке, или если требуется включить исходный код в предварительную компиляцию.
Параметры предварительно скомпилированного заголовка: /Yc (создать файл предварительно скомпилированного заголовка) и /Yu (использовать файл предварительно скомпилированного заголовка).) Используется /Yc для создания предварительно скомпилированного заголовка. При использовании с необязательным hdrstop pragma /Yc позволяет предварительно скомпилировать файлы заголовков и исходный код. Выберите /Yu для использования существующего предварительно скомпилированного заголовка в существующей компиляции. С параметрами /Yc и /Yu параметрами можно также /Fp указать альтернативное имя предкомпилированного заголовка.
Справочные статьи о параметрах /Yu компилятора и /Yc о том, как получить доступ к этим функциям в среде разработки.
Предварительно скомпилированные правила согласованности заголовков
Так как PCH-файлы содержат сведения о среде компьютера и адресе памяти о программе, следует использовать только PCH-файл на компьютере, на котором он был создан.
Правила согласованности для использования предварительно скомпилированных заголовков для каждого файла
Параметр /Yu компилятора позволяет указать, какой PCH-файл следует использовать.
При использовании PCH-файла компилятор предполагает ту же среду компиляции (которая использует согласованные параметры компилятора, pragmas и т. д.), которая действует при создании PCH-файла, если не указано иное. Если компилятор обнаруживает несогласованность, он выдает предупреждение и по возможности определяет несогласованность. Такие предупреждения не обязательно указывают на проблему с файлом PCH. Они просто предупреждают о возможных конфликтах. Требования к согласованности для файлов PCH описаны в следующих разделах.
Согласованность параметров компилятора
Следующие параметры компилятора могут вызвать предупреждение о несогласованности при использовании файла PCH:
Макросы, созданные с помощью параметра препроцессора ( /D ), должны совпадать между компиляцией, создающей PCH-файл и текущую компиляцию. Состояние определенных констант не проверяется, но непредсказуемые результаты могут произойти при изменении этих макросов.
PCH-файлы не работают с параметрами и /EP параметрами /E .
PCH-файлы должны создаваться с помощью параметра "Создать сведения о просмотре" ( /FR ) или параметра "Исключить локальные переменные() перед /Fr последующими компиляциями, которые используют PCH-файл, могут использовать эти параметры.
C 7.0-compatible ( /Z7 )
Если этот параметр действует при создании PCH-файла, последующие компиляции, использующие PCH-файл, могут использовать сведения об отладке.
Если параметр C 7.0-Compatible ( /Z7 ) не действует при создании PCH-файла, последующие компиляции, использующие PCH-файл и /Z7 запускающие предупреждение. Сведения об отладке помещаются в текущий .obj файл, а локальные символы, определенные в PCH-файле, недоступны отладчику.
Включение согласованности пути
PCH-файл не содержит сведения о пути включения заголовка, который был фактическим при его создании. При использовании PCH-файла компилятор всегда использует путь включения заголовка, указанный в текущей компиляции.
Согласованность исходного файла
При указании параметра Use Precompiled Header File ( /Yu ) компилятор игнорирует все директивы препроцессора (включая pragmas), которые отображаются в исходном коде, который будет предварительно скомпилирован. Компиляция, указанная такими директивами препроцессора, должна совпадать с компиляцией, используемой для параметра Create Precompiled Header File () (Файл заголовка). /Yc
Согласованность pragma
Pragmas, обрабатываемый во время создания PCH-файла, обычно влияет на файл, с которым позже используется PCH-файл. message И comment pragmas не влияют на оставшуюся часть компиляции.
Эти прагмы влияют только на код в PCH-файле; Они не влияют на код, который позже использует PCH-файл:
Эти прагмы сохраняются как часть предкомпилированного заголовка и влияют на оставшуюся часть компиляции, использующую предкомпилированный заголовок:
alloc_text
auto_inline
check_stack
code_seg
data_seg
function
include_alias
init_seg
inline_depth
inline_recursion
intrinsic
optimize
pack
pointers_to_members
setlocale
vtordisp
warning
Правила согласованности для /Yc и /Yu
При использовании предварительно скомпилированного заголовка, созданного с помощью /Yc или /Yu , компилятор сравнивает текущую среду компиляции с той, которая существовала при создании PCH-файла. Не забудьте указать среду, соответствующую предыдущей (с помощью параметров компилятора, прагм и т. д.) для текущей компиляции. Если компилятор обнаруживает несогласованность, он выдает предупреждение и по возможности определяет несогласованность. Такие предупреждения не обязательно указывают на проблему с файлом PCH. Они просто предупреждают о возможных конфликтах. В следующих разделах объясняются требования к согласованности для предкомпилированных заголовков.
Согласованность параметров компилятора
В таблице ниже перечислены параметры компилятора, которые могут вызвать предупреждение о несогласованности при использовании предкомпилированного заголовка.
Параметр | name | Правило |
---|---|---|
/D | Определение констант и макросов | Должны быть одинаковыми в компиляции, создавшей предкомпилированный заголовок, и в текущей компиляции. Состояние определенных констант не проверяется. Однако непредсказуемые результаты могут возникнуть, если файлы зависят от значений измененных констант. |
/E либо /EP | Копирование выходных данных препроцессора в стандартный вывод | Предварительно скомпилированные заголовки не работают с параметром или /EP параметром /E . |
/Fr либо /FR | Создание сведений о браузере исходного кода Майкрософт | Чтобы параметры /Fr /FR были допустимыми с параметром /Yu , они также должны быть введены в действие при создании предварительно скомпилированного заголовка. При последующих компиляциях, использующих предкомпилированный заголовок, также создаются сведения о браузере исходного кода. Сведения о браузере помещаются в один .sbr файл и ссылаются на другие файлы так же, как и сведения CodeView. Невозможно переопределить размещение сведений о исходном браузере. |
/GA , /GD , /GE , /Gw или /GW | Параметры протокола Windows | Должны быть одинаковыми в компиляции, создавшей предкомпилированный заголовок, и в текущей компиляции. Если эти параметры различаются, выдается предупреждение. |
/Zi | Создание полной отладочной информации | Если при создании предкомпилированного заголовка этот параметр включен, последующие компиляции, использующие предварительную компиляцию, могут использовать отладочную информацию. Если /Zi не действует при создании предварительно скомпилированного заголовка, последующие компиляции, использующие предварительную компиляцию, и /Zi параметр активирует предупреждение. Сведения об отладке помещаются в текущий файл объекта, а локальные символы, определенные в предварительно скомпилированных заголовках, недоступны отладчику. |
Средство предварительно откомпилированных заголовков предназначено для использования только в исходных файлах C и C++.
Использование предварительно скомпилированных заголовков в проекте
В предыдущих разделах представлен обзор предкомпилированных заголовков: /Yc и /Yu, параметра /FP и прагмы hdrstop. В этом разделе описывается метод использования в проекте параметров заголовков, предкомпилированных вручную. В конце раздела приводится пример файла makefile и кода, который управляет им.
Для другого подхода к использованию параметров предварительно скомпилированного заголовка вручную в проекте изучите один из файлов makefile, расположенных в MFC\SRC каталоге, созданном во время настройки по умолчанию Visual Studio. Эти файлы makefile имеют аналогичный подход, представленный в этом разделе. Они делают больший доступ к макросам программы технического обслуживания (NMAKE) и обеспечивают более широкий контроль над процессом сборки.
PCH-файлы в процессе сборки
База кода проекта программного обеспечения часто содержится в нескольких исходных файлах C или C++, файлах объектов, библиотеках и файлах заголовков. Как правило, файл makefile координирует объединение этих элементов в исполняемый файл. На следующем рисунке показана структура файла makefile, использующего файл предкомпилированного заголовка. Имена макросов NMAKE и имена файлов на этой схеме согласуются с именами в примере кода, приведенного в примере файла makefile для PCH и примера кода для PCH.
На рисунке для отображения последовательности процесса сборки используются три схематических элемента. Прямоугольники представляют каждый файл или макрос; три макроса представляют один или несколько файлов. Затененные области представляют каждое действие компиляции или компоновки. Стрелки показывают, какие файлы и макросы объединяются во время процесса компиляции или компоновки.
Структура файла makefile, использующего файл предкомпилированного заголовка
Начиная с верхней части схемы и BOUNDRY являются макросами NMAKE, STABLEHDRS в которых список файлов, скорее всего, не требует перекомпиляции. Эти файлы компилируются с помощью командной строки
CL /c /W3 /Yc$(BOUNDRY) applib.cpp myapp.cpp
только в том случае, если файл предкомпилированного заголовка ( STABLE.pch ) не существует или если вы вносите изменения в файлы, перечисленные в двух макросах. В любом случае файл предкомпилированного заголовка будет содержать код только из файлов, перечисленных в STABLEHDRS макросе. Вывод списка последнего файла, предварительно скомпилированного в BOUNDRY макросе.
Файлы, перечисленные в этих макросах, могут быть файлами заголовков или файлами исходного кода C или C++. (Один PCH-файл нельзя использовать с источниками C и C++.) Макрос можно использовать для остановки hdrstop предварительной компиляции в какой-то момент в BOUNDRY файле. Дополнительные сведения см. в разделе hdrstop .
Далее на схеме представлен код поддержки, APPLIB.obj используемый в окончательном приложении. Он создается из APPLIB.cpp файлов, перечисленных в UNSTABLEHDRS макросе, и предварительно скомпилированного кода из предкомпилированного заголовка.
MYAPP.obj представляет конечное приложение. Он создается из MYAPP.cpp файлов, перечисленных в UNSTABLEHDRS макросе, и предварительно скомпилированного кода из предкомпилированного заголовка.
Наконец, исполняемый файл ( MYAPP.EXE ) создается путем связывания файлов, перечисленных в OBJS макросе ( APPLIB.obj и MYAPP.obj ).
Пример файла makefile для PCH
В следующем файле makefile используются макросы и !IF структура команд управления , !ELSE !ENDIF которая упрощает адаптацию проекта.
STABLEHDRS Помимо макросов, UNSTABLEHDRS показанных на рисунке "Структура файла Makefile, использующего файл предкомпилированного заголовка" в PCH-файлах в процессе сборки, этот файл makefile предоставляет CLFLAGS макрос и LINKFLAGS макрос BOUNDRY . Эти макросы необходимо использовать для перечисления параметров компилятора и компоновщика, которые применяются при сборке отладочной или финальной версии исполняемого файла приложения. Существует также LIBS макрос, в котором перечислены библиотеки, необходимые для проекта.
Файл makefile также использует !IF , !ELSE !ENDIF чтобы определить, определен ли символ в командной DEBUG строке NMAKE:
Эта функция позволяет использовать один и тот же файл makefile во время разработки и для окончательных версий программы. Используется DEBUG=0 для окончательных версий. Следующие строки команды являются эквивалентными.
Пример кода для PCH
Следующие исходные файлы используются в файле makefile, описанном в PCH-файлах в процессе сборки и образце файла makefile для PCH. Комментарии содержат важную информацию.
Комментарии
Файл включения, указанный параметром /Yu , не указан в исходном файле. Этот параметр включен по умолчанию во многих типах проектов Visual Studio C++. Файл включения по умолчанию, указанный этим параметром, — pch.h или stdafx.h в Visual Studio 2017 и более ранних версиях.
В среде Visual Studio используйте один из следующих методов, чтобы устранить эту ошибку:
Убедитесь, что вы не случайно удалили, переименовали или не удалили файл заголовка pch.h или исходный файл pch.cpp из текущего проекта. (В более старых проектах эти файлы могут называться stdafx.h и stdafx.cpp.)
Убедитесь, что файл заголовка pch.h или stdafx.h включен перед любыми другими директивами кода или препроцессора в исходных файлах. (В Visual Studio этот файл заголовка задается свойством проекта предварительно скомпилированного файла заголовка.)
Вы можете отключить предварительно скомпилированные заголовки. Если вы отключите предварительно скомпилированные заголовки, это может серьезно повлиять на производительность сборки.
Отключение предварительно скомпилированных заголовков
Чтобы отключить использование предварительно скомпилированного заголовка в проекте, выполните следующие действия.
В раскрывающемся списке "Конфигурация" выберите "Все конфигурации".
Выберите страницу свойств >конфигурацииC/C++>Precompiled Headers.
В списке свойств выберите раскрывающийся список для свойства предварительно скомпилированного заголовка и выберите пункт "Не использовать предварительно скомпилированные заголовки". Выберите ОК для сохранения внесенных изменений.
В окне Обозреватель решений щелкните правой кнопкой мыши исходный файл pch.cpp в проекте. (В более старых проектах файл может называться stdafx.cpp.) Выберите "Исключить из Project", чтобы удалить его из сборки.
Используйте команду меню решения BuildClean > для каждой сборки конфигурации, чтобы удалить все файлы project_name.pch в промежуточных каталогах сборки.
Я пытаюсь скомпилировать простую VS-программу на C ++ в качестве задания для класса. Мы только когда-либо включаем, и я продолжаю получать эту ошибку:
Моя программа буквально такая маленькая .
Я только что установил Visual Studio Express 2010. На самом деле мне бы хотелось начать пустой проект вместо установки со всеми этими предопределенными файлами, я думаю, это упростит задачу, но я никогда не получаю такой возможности при создании проекта. У кого-нибудь есть предложения?
Вам необходимо отключить использование предварительно скомпилированных заголовков в настройках вашего проекта (вы также можете снять флажок Использовать предварительно скомпилированные заголовки при создании новых проектов в будущем).
Пожалуйста, улучшите заголовок вашего вопроса. Он не описывает вопрос, а вместо этого перечисляет технологии (для чего нужны теги).
У меня есть свойства проекта, но я не вижу предварительно скомпилированных заголовков. Это в языковых свойствах?
Вы всегда можете отключить использование предварительно скомпилированных заголовков в настройках проекта.
Инструкции для VS 2010 (должны быть аналогичны для других версий VS):
Select your project, use the "Project -> Properties" menu and go to the "Configuration Properties -> C/C++ -> Precompiled Headers" section, then change the "Precompiled Header" setting to "Not Using Precompiled Headers" option.
Если вы пытаетесь настроить минимальный проект Visual Studio только для простых программ командной строки C ++ (например, разработанных во вводных классах программирования C ++), вы можете создать пустой проект C ++ .
@Howdy_McGee std::cout
@ André: Шаблоны Win32 Project и Win32 Console Application также позволяют отключить предварительно скомпилированные заголовки. В любом случае, моя точка зрения заключалась в том, что, поскольку его проблема связана с предварительно скомпилированными заголовками, а предварительно скомпилированные заголовки ортогональны соответствию стандартам, было бы ошибкой вообще поднимать вопрос о соответствии стандартам.
@ildjarn: но проблема не в предварительно скомпилированных заголовках. Настоящая проблема заключается в том, что OP выбрал неправильный тип проекта и / или параметры в диалоговом окне мастера проекта. Поскольку OP пишет школьные задания на том, что кажется простым стандартным C ++, тип проекта, который лучше всего помогает выработать хорошие привычки для написания стандартных совместимых программ C ++ в Visual Studio, - это пустой тип проекта. Отсюда и мое упоминание о соблюдении стандартов.
Прежде всего, я хочу сказать, что я читал о предварительно скомпилированных заголовках и понимаю, что это оптимизация, которая экономит мне время на многократную компиляцию заголовков при каждой сборке.
Я читаю документацию по бусту и вижу, что в инструкции написано:
In Configuration Properties > C/C++ > Precompiled Headers, change Use Precompiled Header (/Yu) to Not Using Precompiled Headers
А потом объясняют:
There's no problem using Boost with precompiled headers; these instructions merely avoid precompiled headers because it would require Visual Studio-specific changes to the source code used in the examples.
это их способ сказать, что образцы не следуют мантре унифицированной модели use-this-lead-in-header-for-pch-generation. IOW, их образцы не подходят для PCH, но вы все равно можете использовать pch with boost в своих проектах, если правильно настроены.
@ user2485710: "Нужно"? Нет, конечно нет. Вам нужна ваша роскошная машина? Тот отпуск, который вы отдыхали в прошлом году? Вы сказали, что вам «нужна» IDE, чтобы «все работало», а не для того, чтобы вам было легче.
Первоначально комментарий, но я могу его опубликовать. Примечание: это характерно для VC ++:
Выделенное жирным шрифтом предложение - это их способ сказать, что образцы не следуют мантре единой модели use-this-lead-in-header-for-pch-generation. IOW, их образцы не подходят для PCH, но вы все равно можете использовать pch with boost в своих проектах, если правильно настроены.
Вы бы отключили их по разным причинам. Некоторые исходные модули, особенно от сторонних производителей, не следуют модели PCH, включающей в себя сквозной заголовок pch с самого начала. Их образцы являются таким кодом (и, следовательно, советуют отключить их для их образцов). Иногда исходные файлы требуют различных конфигураций препроцессора только для этих файлов, а не для всех файлов в проекте; еще одна причина отключить PCH для этих файлов.
Как правило , используется в паре источник / заголовка для создания «один»; предварительно скомпилированное изображение заголовка. Этот файл заголовка обычно включает:
- Любые стандартные системные заголовки библиотеки, используемые вашим проектом.
- Заголовки сторонних SDK
- Практически все остальное, что НЕ находится в активной разработке для вашего проекта.
Короче говоря (трудно поверить), говорит вам образцы их не настроить , как описано выше, и, таким образом, вы должны включить PCH от строя их.
Когда вы используете предварительно скомпилированные заголовки, вам нужно сделать что-то вроде:
Однако в этой истории есть нечто большее, чем просто это. Чтобы предварительно скомпилированные заголовки работали хорошо , вы хотите включить один и тот же набор заголовков в одном и том же порядке в каждый исходный файл.
Это означает, что каждый исходный файл обычно включает множество заголовков, которые ему на самом деле не нужны. Это, в свою очередь, означает, что если вы не используете предварительно скомпилированные заголовки, вы получите гораздо более медленную компиляцию, чем если бы вы вообще ничего не делали для поддержки предварительно скомпилированных заголовков.
Читайте также: