Не удается открыть файл предкомпилированный заголовок

Обновлено: 07.07.2024

Когда я создаю свое решение на C ++ в Visual Studio, оно жалуется на отсутствие файла xxxxx.pch. Есть ли параметр, который мне не хватает, чтобы вернуть предварительно скомпилированные заголовки?

Вот точная ошибка для полноты:

ПРИМЕЧАНИЕ. Более поздние версии IDE могут использовать «pch» вместо «stdafx» в именах по умолчанию для связанных файлов. В приведенных ниже инструкциях может потребоваться заменить pch на stdafx. Я прошу прощения. Это не моя вина.

  1. Щелкните правой кнопкой мыши свой проект в обозревателе решений.
  2. Щелкните Свойства в нижней части раскрывающегося меню.
  3. В левом верхнем углу страниц свойств выберите в раскрывающемся меню «Все конфигурации».
  4. Откройте дерево C / C ++ и выберите Предварительно скомпилированные заголовки.
  5. Предварительно скомпилированный заголовок: выберите "Использовать" (/ Yu)
  6. Заполните поле Precompiled Header File. Стандарт - stdafx.h

Lucky 13. Скрестите пальцы и нажмите Build.

Я искал файл iOS PCH с той же проблемой, если вы попали сюда, как и я, решение, которое я нашел, - очистить производные данные; Закройте симуляторы, перейдите к параметрам xCode -> местоположения -> перейдите к пути к файлу производных данных, закройте xCode, удалите файлы в папке производных данных, перезапустите и приветствуйте :)

Я знаю, что эта тема очень старая, но недавно я имел дело с этим в VS2015, и что помогло, так это удаление папок сборки и ее повторная сборка. Это могло произойти из-за попытки закрыть программу или из-за остановки / зависания программы VS во время сборки.

Если все верно, но эта ошибка присутствует, необходимо проверить следующий раздел в файле ****. Vcxproj:

В моем случае это было неверное имя конфигурации: только первое слово.

Попробуйте Build> Clean Solution, затем Build> Build Solution. Это работает для меня.

AppCenter запускает команду «pod install» только в том случае, если он находит Pofile и НЕ находит папку PODS в файлах.

У меня была отмечена папка, но поскольку git автоматически игнорирует файлы .pch (проверьте .gitignore, чтобы проверить это), мой .pch не проверялся.

Я решил проблему, заставив файлы .pch проверять ее, но удаление папки PODS тоже должно работать, поскольку в этом случае Appcenter запустит команду установки модуля.

Надеюсь, это кому-то поможет.

  1. Щелкните правой кнопкой мыши проект и выберите пункт меню свойств.
  2. goto C / C ++ -> Предварительно скомпилированные заголовки
  3. Выберите "Не использовать предварительно скомпилированные заголовки"

Убедитесь, что в вашем проекте есть xxxxx.cpp

Скомпилируйте xxxxx.cpp с флагом / Yc ( Создать предварительно скомпилированный заголовок)
(щелкните правой кнопкой мыши xxxxx.cpp -> свойства -> Предварительно скомпилированные заголовки -> создать )

Скомпилируйте все остальные файлы с флагом / Yu ( Используйте предварительно скомпилированный заголовок)
(щелкните правой кнопкой мыши проект -> свойства -> Предварительно скомпилированные заголовки -> использовать )

Использование предварительно скомпилированного заголовка (pch) - это двухэтапный процесс.

На первом этапе вы компилируете файл-заглушку (в VS200x он обычно называется stdafx.cpp . В более новых версиях используется pch.cpp .). Этот файл-заглушка косвенно включает только те заголовки, которые вы хотите предварительно скомпилировать. Обычно в одном небольшом заголовке (обычно stdafx.h или pch.hpp ) перечислены стандартные заголовки, такие как <iostream> и <string> , которые затем включаются в файл-заглушку. При компиляции создается файл .pch.

На шаге 2 ваш фактический исходный код включает тот же небольшой заголовок из шага 1, что и первый заголовок. Компилятор, когда он встречает этот специальный заголовок, вместо этого читает соответствующий файл .pch. Это означает, что ему не нужно каждый раз (пере) компилировать эти стандартные заголовки.

В вашем случае кажется, что шаг 1 не выполняется. Файл-заглушка все еще присутствует? В вашем случае это, вероятно, будет xxxxx.cpp . Это должен быть файл, скомпилированный с помощью /Yc:xxxxx.pch , поскольку это флаг компилятора, указывающий, что это шаг 1 процесса PCH. Если присутствует xxxxx.cpp и является таким файлом-заглушкой, то, вероятно, отсутствует его параметр компилятора /Yc: .

VS облажался (у меня 2019; (). Продолжайте и выберите «не использовать предварительно скомпилированные заголовки», как указывают другие ребята, затем откройте файл проекта (vcxproj) с помощью любого текстового редактора и удалите выделенные две записи в двух местах. Наслаждайтесь На самом деле, запись pch.h в файле vcxproj, которую вы видите ниже, вы всегда найдете в интерфейсах свойств VS.

При создании нового проекта в Visual Studio в проект добавляется файл предкомпилированного заголовка с именем pch.h. (В Visual Studio 2017 и более ранних версиях файл назывался stdafx.h.) Цель файла — ускорить процесс сборки. Здесь следует включить любые стабильные файлы заголовков, например заголовки стандартной библиотеки, такие как <vector> . Предкомпилированный заголовок компилируется только в том случае, если он или какие-либо содержащиеся в нем файлы были изменены. Если изменения вносятся только в исходный код проекта, при сборке будет пропущена компиляция для предкомпилированного заголовка.

Параметры компилятора для предкомпилированных заголовков — /Y. На страницах свойств проекта параметры находятся в разделе Свойства конфигурации > C/C++ > Предварительно скомпилированные заголовки. Можно не использовать предкомпилированные заголовки, а также указать имя файла заголовка и путь к выходному файлу.

Настраиваемый предварительно скомпилированный код

Для больших проектов, для которых требуется значительное время, может потребоваться создать настраиваемые предварительно скомпилированные файлы. Компиляторы Microsoft C и C++ содержат параметры для предварительной компиляции любого кода C или C++, включая встроенный код. Данная возможность позволяет скомпилировать стабильное тело кода, сохранять скомпилированное состояние кода в файле, а при последующих компиляциях объединять предварительно скомпилированный код с кодом, который еще находится в стадии разработки. Каждая последующая компиляция выполняется быстрее, так как стабильный код не нужно компилировать повторно.

Случаи использования предварительной компиляции исходного кода

Предварительно скомпилированный код полезен во время цикла разработки, чтобы сократить время компиляции, особенно если:

Всегда используется большой текст кода, в который редко вносятся изменения.

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

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

Можно предварительно скомпилировать программы C и C++. В программировании на языке C++ распространенной практикой является отделение сведений об интерфейсе класса в файлы заголовков. Впоследствии эти файлы заголовков можно будет включать в программы, использующие класс. Предварительная компиляция этих заголовков позволяет сократить время, затрачиваемое программой на компиляцию.

Хотя для каждого исходного файла можно использовать только один файл предкомпилированного заголовка (PCH), в проекте можно использовать несколько файлов PCH.

Два варианта предварительной компиляции кода

Можно предварительно скомпилировать любой код C или C++ — вы не ограничены предварительной компиляцией только файлов заголовков.

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

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

Параметры предкомпилированного заголовка см. в разделах /Yc (создание файла предкомпилированного заголовка) и /Yu (использование файла предкомпилированного заголовка). Для создания предкомпилированного заголовка используйте /Yc. При использовании с необязательной прагмой hdrstop параметр /Yc позволяет предварительно компилировать как файлы заголовков, так и исходный код. Выберите /Yu, чтобы использовать существующий предкомпилированный заголовок в существующей компиляции. Можно также использовать /Fp с параметрами /Yc и /Yu, чтобы предоставить альтернативное имя предкомпилированному заголовку.

В справочных разделах, посвященных параметрам компилятора /Yu и /Yc, обсуждаются способы доступа к этой функции в среде разработки.

Правила согласованности предкомпилированных заголовков

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

Правила целостности для пофайлового использования предкомпилированных заголовков

Параметр компилятора /Yu позволяет указать, какой файл PCH следует использовать.

При использовании файла PCH компилятор предполагает ту же среду компиляции, которая использует последовательные параметры компилятора, прагмы и т. д., которые действуют при создании файла PCH, если не указано иное. Если компилятор обнаруживает несогласованность, он выдает предупреждение и по возможности определяет несогласованность. Такие предупреждения не обязательно указывают на проблему с файлом PCH. Они просто предупреждают о возможных конфликтах. Требования к согласованности для файлов PCH описаны в следующих разделах.

Согласованность параметров компилятора

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

Макросы, созданные с помощью параметра препроцессора (/D), должны быть одинаковыми в компиляциях, создавшими файл PCH, и текущей компиляцией. Состояние определенных констант не проверяется, но при их изменениях могут возникать непредсказуемые результаты.

Файлы PCH не работают с параметрами/E и /EP.

Файлы PCH должны быть созданы с помощью параметра создания сведений о просмотре (/FR) или исключения локальных переменных (/Fr), прежде чем последующие компиляции, использующие файл PCH, смогут использовать эти параметры.

C7 совместимо (/Z7)

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

Если при создании файла PCH параметр "C7 совместимо (/Z7)" отключен, последующие компиляции, использующие файл PCH и/Z7, вызывают предупреждение. Отладочная информация помещается в текущий OBJ-файл, а локальные символы, определенные в файле PCH, недоступны отладчику.

Согласованность пути включаемых файлов

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

Согласованность исходного файла

При указании параметра использования файла предкомпилированного заголовка (/Yu) компилятор игнорирует все директивы препроцессора (включая прагмы), отображаемые в исходном коде, который будет предварительно скомпилирован. Компиляция, указанная такими директивами препроцессора, должна совпадать с компиляцией, используемой для параметра создания файла предкомпилированного заголовка (/Yc).

Согласованность прагмы

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

Они влияют только на код в файле 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 Копирование выходных данных препроцессора в стандартный вывод Предкомпилированные заголовки не работают с параметром /E или /EP.
/FR или /FR Создание сведений о браузере исходного кода Майкрософт Чтобы параметры /Fr и /FR были допустимыми вместе с параметром /Yu, они также должны применяться при создании предкомпилированного заголовка. При последующих компиляциях, использующих предкомпилированный заголовок, также создаются сведения о браузере исходного кода. Сведения о браузере помещаются в один SBR-файл, и на него ссылаются другие файлы так же, как и сведения CodeView. Нельзя переопределить размещение сведений о браузере исходного кода.
/GA, /GD, /GE, /Gw или /GW Параметры протокола Windows Должны быть одинаковыми в компиляции, создавшей предкомпилированный заголовок, и в текущей компиляции. Если эти параметры различаются, выдается предупреждение.
/ZI Создание полной отладочной информации Если при создании предкомпилированного заголовка этот параметр включен, последующие компиляции, использующие предварительную компиляцию, могут использовать отладочную информацию. Если при создании предкомпилированного заголовка параметр /Zi не был включен, последующие компиляции, использующие предварительную компиляцию и параметр /Zi, выдают предупреждение. Отладочная информация помещается в текущий OBJ-файл, а локальные символы, определенные в предкомпилированном заголовке, недоступны отладчику.

Средство предварительно откомпилированных заголовков предназначено для использования только в исходных файлах C и C++.

Использование предкомпилированных заголовков в проекте

В предыдущих разделах представлен обзор предкомпилированных заголовков: /Yc и /Yu, параметра /FP и прагмы hdrstop. В этом разделе описывается метод использования в проекте параметров заголовков, предкомпилированных вручную. В конце раздела приводится пример файла makefile и кода, который управляет им.

Чтобы ознакомиться с другим подходом к использованию в проекте параметров заголовков, предкомпилированных вручную, изучите один из файлов makefile, расположенных в каталоге MFC\SRC, который создается во время установки Visual Studio по умолчанию. Подход в этих файлах makefile аналогичен представленному в этом разделе, однако в них используются макросы служебной программы обслуживания Майкрософт (NMAKE) и обеспечивается больший контроль над процессом сборки.

PCH-файлы в процессе построения

База кода проекта программного обеспечения обычно содержится в нескольких исходных файлах C или C++, объектных файлах, библиотеках и файлах заголовков. Как правило, файл makefile координирует объединение этих элементов в исполняемый файл. На следующем рисунке показана структура файла makefile, использующего файл предкомпилированного заголовка. Имена макросов и имена файлов на рисунке соответствуют приведенным в примере кода в разделах Пример файла makefile для PCH и Пример кода для PCH.

На рисунке для отображения последовательности процесса сборки используются три схематических элемента. Прямоугольники представляют каждый файл или макрос; три макроса представляют один или несколько файлов. Затененные области представляют каждое действие компиляции или компоновки. Стрелки показывают, какие файлы и макросы объединяются во время процесса компиляции или компоновки.


Структура файла makefile, использующего файл предкомпилированного заголовка

Начиная с верхней части диаграммы, STABLEHDRS и BOUNDRY являются макросами NMAKE, в которых вы перечислите файлы, которые, скорее всего, не потребуют перекомпиляции. Эти файлы компилируются с помощью командной строки

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, BOUNDRY и UNSTABLEHDRS, показанных на рисунке "Структура файла makefile, использующего файл предкомпилированного заголовка" в разделе PCH-файлы в процессе сборки, этот файл makefile предоставляет макрос CLFLAGS и макрос LINKFLAGS. Эти макросы необходимо использовать для перечисления параметров компилятора и компоновщика, которые применяются при сборке отладочной или финальной версии исполняемого файла приложения. Также имеется макрос LIBS, в котором перечислены библиотеки, необходимые для проекта.

Файл makefile также использует структуру команд !IF, !ELSE, !ENDIF для обнаружения того, определен ли символ DEBUG в командной строке NMAKE:

Эта функция позволяет использовать один и тот же файл makefile во время разработки и для финальных версий программы — используйте DEBUG=0 для финальных версий. Следующие строки команды являются эквивалентными.

Дополнительные сведения о файлах makefile см. в разделе Справочник по NMAKE. См. также разделы Параметры компилятора MSVC и Параметры компоновщика MSVC.

Пример кода для PCH

Следующие исходные файлы используются в файле makefile, который описан в разделах PCH-файлы в процессе сборки и Образец файла makefile для PCH. Обратите внимание, что комментарии содержат важную информацию.

Доброго времени суток, возникла проблема при компиляции проекта. Такие вот ошибки(среда MVS 2013):

1>------ Перестроение всех файлов начато: проект: DX11 Framework, Конфигурация: Debug Win32 ------
1> Window.cpp
1>e:\in_game\my_models_projects\mvs_projects\dx11 framework\dx11 framework\window.cpp(1): fatal error C1083: Не удается открыть файл предкомпилированный заголовок: E:\in_Game\my_models_projects\MVS_Projects\DX11 Framework\obj\Debug\DX11 Framework_d.pch: No such file or directory
1> stdafx.cpp
1>e:\in_game\my_models_projects\mvs_projects\dx11 framework\dx11 framework\stdafx.cpp(1): fatal error C1083: Не удается открыть файл предкомпилированный заголовок: E:\in_Game\my_models_projects\MVS_Projects\DX11 Framework\obj\Debug\DX11 Framework_d.pch: No such file or directory
1> Render.cpp
1>e:\in_game\my_models_projects\mvs_projects\dx11 framework\dx11 framework\render.cpp(1): fatal error C1083: Не удается открыть файл предкомпилированный заголовок: E:\in_Game\my_models_projects\MVS_Projects\DX11 Framework\obj\Debug\DX11 Framework_d.pch: No such file or directory
1> Log.cpp
1>e:\in_game\my_models_projects\mvs_projects\dx11 framework\dx11 framework\log.cpp(1): fatal error C1083: Не удается открыть файл предкомпилированный заголовок: E:\in_Game\my_models_projects\MVS_Projects\DX11 Framework\obj\Debug\DX11 Framework_d.pch: No such file or directory
1> InputMgr.cpp
1>e:\in_game\my_models_projects\mvs_projects\dx11 framework\dx11 framework\inputmgr.cpp(1): fatal error C1083: Не удается открыть файл предкомпилированный заголовок: E:\in_Game\my_models_projects\MVS_Projects\DX11 Framework\obj\Debug\DX11 Framework_d.pch: No such file or directory
1> Framework.cpp
1>e:\in_game\my_models_projects\mvs_projects\dx11 framework\dx11 framework\framework.cpp(1): fatal error C1083: Не удается открыть файл предкомпилированный заголовок: E:\in_Game\my_models_projects\MVS_Projects\DX11 Framework\obj\Debug\DX11 Framework_d.pch: No such file or directory
1> Создание кода.
========== Перестроение всех: успешно: 0, с ошибками: 1, пропущено: 0 ==========

В настройках проекта проверил предкомпилируемые заголовки включены. В чем проблема?

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Заголовок колонки listbox'а
Доброго времени суток! Подскажите пожалуйста, как задать название колонки listbox'у?

Заголовок в панели задач
люди кто знает как изменять имя окна типа как в винампе или в aimp чтобы типа бегущая строка?

Заголовок видеофайла формата .yuv
Добрый день. Возникла проблема с видеофайлом формата .yuv. Необходимо наложить на каждый кадр.

When I build my c++ solution in Visual Studio it complains that the xxxxx.pch file is missing. Is there a setting I am missing to get the pre-compiled headers back?

here is the exact error for completeness:

3,814 8 8 gold badges 34 34 silver badges 54 54 bronze badges you have to provide more info. what error exactly are you getting? how is your project currently configured?

12 Answers 12

NOTE: Later versions of the IDE may use "pch" rather than "stdafx" in the default names for related files. It may be necessary to substitute pch for stdafx in the instructions below. I apologize. It's not my fault.

  1. Right-click on your project in the Solution Explorer.
  2. Click Properties at the bottom of the drop-down menu.
  3. At the top left of the Properties Pages, select All Configurations from the drop-down menu.
  4. Open the C/C++ tree and select Precompiled Headers
  5. Precompiled Header: Select Use (/Yu)
  6. Fill in the Precompiled Header File field. Standard is stdafx.h

Lucky 13. Cross your fingers and hit Build.


15.6k 9 9 gold badges 47 47 silver badges 65 65 bronze badges This should be the accepted answer, as the other one is missing steps 10 and 11. Thanks! This is a more basic answer than mine. Step 1-7 are necessary to get PCH working, but the error message from the question indicates those steps have already been done. OTOH, it assumes a single stdafx.pch file, while the xxxxx.pch from the question hints at a more complex problem (multi-PCH setup). Thank you, sir! Going back to my C/C++r roots for a new project and I feel like a bit of a spaz

Precompiled Header (pch) use is a two-step process.

In step one, you compile a stub file (In VS200x it's usually called stdafx.cpp . Newer versions use pch.cpp .). This stub file indirectly includes only the headers you want precompiled. Typically, one small header (usually stdafx.h or pch.hpp ) lists standard headers such as <iostream> and <string> , and this is then included in the stub file. Compiling this creates the .pch file.

In step 2, your actual source code includes the same small header from step 1 as the first header. The compiler, when it encounters this special header, reads the corresponding .pch file instead. That means it doesn't have to (re)compile those standard headers every time.

Читайте также: