Как исправить файл .pch, отсутствующий при сборке?

164

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

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

Error   1   fatal error C1083: Cannot open precompiled header file: 'Debug\xxxxx.pch': No such file or directory
Сэм Маккрилл
источник
1
Вы должны предоставить больше информации. какую именно ошибку вы получаете? как настроен ваш проект?
Ассаф Лави
Просто простая перестройка все исправила мою проблему.
Deqing

Ответы:

436

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

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

  8. Если у вас нет файла stdafx.h в заголовочных файлах, поместите его туда. Отредактируйте его так, чтобы #include все заголовки, которые вы хотите предварительно скомпилировать.

  9. Поместите файл с именем stdafx.cpp в ваш проект. Поместите #include "stdafx.h" вверху и ничего больше.
  10. Щелкните правой кнопкой мыши stdafx.cpp в обозревателе решений. Снова выберите Свойства и Все конфигурации, как в шаге 4 ...
  11. ... но на этот раз выберите Precompiled Header Create (/ Yc). Это будет связано только с одним файлом stdafx.cpp.
  12. Поместите #include "stdafx.h" в самый верх всех ваших исходных файлов.

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

Джайв Дадсон
источник
58
Я не знал, что stdafx.cpp должен иметь разные настройки. Отличный ответ.
эксперт
5
Это должен быть принятый ответ, так как в другом нет шагов 10 и 11. Спасибо!
Дж.Бентли,
2
Это более простой ответ, чем мой. Шаги 1-7 необходимы, чтобы заставить PCH работать, но сообщение об ошибке в вопросе указывает, что эти шаги уже выполнены. OTOH, он предполагает один stdafx.pchфайл, в то время как xxxxx.pchиз вопроса намекает на более сложную проблему (настройка нескольких PCH).
MSalters
1
Этот ответ действительно спас день. Спасибо.
Мэтт Крейг
Спасибо, сэр! Возвращаясь к своим корням C / C ++ r для нового проекта, и я чувствую себя немного спамом
Colby Africa
59

Использование предварительно скомпилированного заголовка (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:опции компилятора.

MSalters
источник
13
тогда, вероятно, отсутствует опция / Yc: compiler. Кстати, эта опция находится на страницах свойств проекта / Свойства конфигурации / C-C ++ / Предварительно скомпилированные заголовки
wip
22

Fix:

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

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

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

franckspike
источник
Это исправило меня. Большое спасибо!
CharlesW
7
  1. Щелкните правой кнопкой мыши проект и выберите пункт меню свойств
  2. Перейти к C / C ++ -> Скомпилированные заголовки
  3. Выберите «Не использовать предварительно скомпилированные заголовки»
jpabess
источник
Это сработало для меня. Я удалил «stdafx.cpp», затем, когда я добавил его обратно, эта ошибка не исчезнет, ​​пока я не отключу предварительно скомпилированные заголовки. В любом случае, проект крошечный, поэтому он не имеет большого значения для скорости.
Контанго
3
4. ВыберитеCreate (/Yc) (чтобы восстановить, а затем использовать его снова)
Bitterblue
2

Да, это можно устранить с помощью параметров / Yc, как указали другие, но, скорее всего, вам не нужно прикасаться к нему, чтобы исправить это. Почему вы получаете эту ошибку в первую очередь без изменения каких-либо настроек? Возможно, вы «очистили» проект и попытались скомпилировать один файл cpp. Вы получите эту ошибку в этом случае, потому что заголовок прекомпилятора теперь отсутствует. Просто соберите весь проект (даже если он неудачный), а затем соберите какой-нибудь отдельный файл cpp, и вы не получите эту ошибку.

зар
источник
2

В случае, если это происходит с вами при сборке сервера (AppCenter) и вы, используя CocoaPods, убедитесь, что ваш Podfile установлен.

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

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

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

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

Марко Лейте
источник
0

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

<ClCompile Include="stdafx.cpp">
  <PrecompiledHeader Condition=

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

Сергей АркТехно
источник
0

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

glover12
источник
Да, но оригинальный вопрос касался VS2008, а не VS2015. У вас есть уверенность, что это решит проблему ОП?
T-Heron
Независимо от версии VS проблема по-прежнему возникает в разных сборках. Просто попробуйте и посмотрите, сработает ли это с тем, с кем вы будете иметь дело.
glover12
0

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

Ахмед Авад
источник
-1

Попробуйте Построить> Чистое решение, затем Построить> Построить решение. Это работает для меня.

Ник Донг
источник