Pch h c ошибка

Если вы не используете предварительно скомпилированные заголовки в своем проекте, установите для свойства Создать / Использовать предварительно скомпилированные заголовки исходных файлов значение Не использовать предварительно скомпилированные заголовки. Чтобы установить этот параметр компилятора, выполните следующие действия:

  • На панели «Обозреватель решений» проекта щелкните правой кнопкой мыши
    имя проекта и выберите «Свойства».

  • На левой панели щелкните папку C / C ++.

  • Щелкните по узлу «Предварительно скомпилированные заголовки».

  • На правой панели щелкните «Создать / использовать предварительно
    скомпилированный заголовок», а затем нажмите «Не использовать
    предварительно скомпилированные заголовки».

Убедитесь, что вы случайно не удалили, не переименовали или не удалили файл заголовка (по умолчанию stdafx.h) из текущего проекта. Этот файл также должен быть включен перед любым другим кодом в ваших исходных файлах с использованием #include «stdafx.h». (Этот заголовочный файл указан как свойство проекта «Создать / использовать PCH через файл»)
Источник

1 / 1 / 0

Регистрация: 01.02.2020

Сообщений: 14

1

15.02.2020, 16:22. Показов 18808. Ответов 21


Студворк — интернет-сервис помощи студентам

Создаю консольное приложение в VS 2019, пишу ВЫШЕ исострима #include «pch.h» он выдаёт ошибку. В исходных файлах библиотеки тоже нету. Как добавить или исправить. Пол интернета перешерстил ничего не нашёл



0



194 / 151 / 44

Регистрация: 11.11.2019

Сообщений: 345

15.02.2020, 16:44

2

Вы можете отключить использование Precompiled Headers в свойствах проекта (Alt+F7). Вместо Use нужно поставить Not using…
Тогда при компиляции VS не будет искать файл «pch.h»

Миниатюры

E1696 не удается открыть источник файл pch.h
 



0



«C with Classes»

1634 / 1392 / 521

Регистрация: 16.08.2014

Сообщений: 5,828

Записей в блоге: 1

15.02.2020, 16:45

3

Цитата
Сообщение от fl0op
Посмотреть сообщение

пишу ВЫШЕ исострима #include «pch.h»

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



0



6577 / 4562 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

15.02.2020, 16:45

4

Цитата
Сообщение от fl0op
Посмотреть сообщение

Создаю консольное приложение в VS 2019, пишу ВЫШЕ исострима #include «pch.h» он выдаёт ошибку.

Просто не пиши #include «pch.h» и всё. Зачем он тебе?



0



1 / 1 / 0

Регистрация: 01.02.2020

Сообщений: 14

15.02.2020, 16:53

 [ТС]

5

Тогда он пишет ошибку С1010 непредвиденный конец файла во время поиска предкомпилированного заголовка. Возможно, вы забыли добавить директиву «#include «pch.h»» в источник. Когда добавляю, он пишет ранее указанную ошибку. Просто напишите, как его добавить, чтобы при создании консольного приложения он был в исходный файлах



0



6577 / 4562 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

15.02.2020, 17:03

6

Цитата
Сообщение от fl0op
Посмотреть сообщение

Тогда он пишет ошибку С1010 непредвиденный конец файла во время поиска предкомпилированного заголовка. Возможно, вы забыли добавить директиву «#include «pch.h»» в источник. Когда добавляю, он пишет ранее указанную ошибку. Просто напишите, как его добавить, чтобы при создании консольного приложения он был в исходный файлах

Проще отключить. Для начала сделай то, что написал fao, если не поможет, посмотри свойства cpp-файла и поставь No в Precompiled Header.

Добавлено через 31 секунду
И смотри, чтоб Configuration была нужная



0



1 / 1 / 0

Регистрация: 01.02.2020

Сообщений: 14

15.02.2020, 17:04

 [ТС]

7

я всё это уже делал, напиши КАК ВКЛЮЧИТЬ pch.h в консольное приложение при создании. Я у кого не смотрю созданные проги, в исходных файлах есть pch.h, у меня нету



0



6577 / 4562 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

15.02.2020, 17:08

8

Цитата
Сообщение от fl0op
Посмотреть сообщение

я всё это уже делал, напиши КАК ВКЛЮЧИТЬ pch.h в консольное приложение при создании. Я у кого не смотрю созданные проги, в исходных файлах есть pch.h, у меня нету

Создай файлы pch.h и pch.cpp. В pch.cpp сделай #include «pch.h». Потом в свойствах pch.cpp установи Precompiled Header = Create



0



1 / 1 / 0

Регистрация: 01.02.2020

Сообщений: 14

15.02.2020, 17:10

 [ТС]

9

где создать



1



6577 / 4562 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

15.02.2020, 17:15

10

Цитата
Сообщение от fl0op
Посмотреть сообщение

где создать

File->New->File…
Я тебе ещё раз повторяю — если этого pch.h нет после создания проекта (а в Console Application его нет), значит он нахрен там не нужен, т.е. ты что-то наковырял уже сам. Просто создай новый проект и перетащи свои файлы из старого, кривого.



1



1 / 1 / 0

Регистрация: 01.02.2020

Сообщений: 14

15.02.2020, 18:25

 [ТС]

11

В том та и прикол, что я так делаю, он мне выдаёт эту ошибку, поэтому я и спрашиваю



0



6577 / 4562 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

15.02.2020, 18:30

12

Цитата
Сообщение от fl0op
Посмотреть сообщение

В том та и прикол, что я так делаю, он мне выдаёт эту ошибку, поэтому я и спрашиваю

Очевидно, что что-то ты делаешь не так. Тебе здесь вроде всё расписали, что нужно сделать. Предлагаешь поугадывать, где ты косячишь?



0



1550 / 875 / 179

Регистрация: 05.12.2015

Сообщений: 2,555

15.02.2020, 18:35

13

Цитата
Сообщение от fl0op
Посмотреть сообщение

В том та и прикол, что я так делаю

Зачем? Что вы хотите получить от этого файла? Чтоб было как у всех? Вам несколько раз написали, что на данном этапе обучения, вам предварительно откомпилированные заголовки на хрен не нужны. Когда они вам понадобятся, добавить их использование в проект не составит для вас никаких проблем. А сейчас, если пытаетесь откомпилировать чужой код, состоящий из одного файла, просто удалите строку #include «pch.h». Она вам не нужна.



0



1 / 1 / 0

Регистрация: 01.02.2020

Сообщений: 14

15.02.2020, 18:36

 [ТС]

14

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



0



6577 / 4562 / 1843

Регистрация: 07.05.2019

Сообщений: 13,726

15.02.2020, 18:38

15

Цитата
Сообщение от fl0op
Посмотреть сообщение

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

А если не вписываешь и не запускаешь другую прогу, то что?



0



194 / 151 / 44

Регистрация: 11.11.2019

Сообщений: 345

15.02.2020, 18:40

16

Цитата
Сообщение от fl0op
Посмотреть сообщение

Я у кого не смотрю созданные проги, в исходных файлах есть pch.h, у меня нету

Посмотрите сюда: https://docs.microsoft.com/en-… ew=vs-2019.
Если вы создаете проект по такому шаблону, то там не будет файла pch.h. Возможно проекты, которые вы видели созданы с использованием других шаблонов.



0



1550 / 875 / 179

Регистрация: 05.12.2015

Сообщений: 2,555

15.02.2020, 18:44

17

Цитата
Сообщение от fl0op
Посмотреть сообщение

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

не вписывайте.

Цитата
Сообщение от oleg-m1973
Посмотреть сообщение

если я запускаю другую прогу, где он был, выдаёт ту же ошибку.

Удалите строчку #include «pch.h»

Какгрится, на все случаи жизни.



0



367 / 309 / 64

Регистрация: 14.10.2014

Сообщений: 1,309

15.02.2020, 20:50

18

fao, Вся эта «предкомпилированная хреновина» отключается на раз в настройках проекта, как — вам уже сообщили . После — нужно удалить файлы из проекта (ручками жмём на них правой кнопкой и выбираем удалить)Но если и с этим возникли трудности — остаётся последнее — создать новый пустой проект — создать в нем файл с исходниками и скопировать в него текст из не запускаемого проекта, естественно без #include «pch.h»



0



194 / 151 / 44

Регистрация: 11.11.2019

Сообщений: 345

15.02.2020, 21:18

19

Цитата
Сообщение от Recrut_rf
Посмотреть сообщение

fao, Вся эта «предкомпилированная хреновина» отключается на раз в настройках проекта

Дык я и так в курсе



0



1550 / 875 / 179

Регистрация: 05.12.2015

Сообщений: 2,555

15.02.2020, 21:25

20

fao, видимо, Recrut_rf fao с fl0op перепутал. Но, ничего. Главное, что любой эрудированный человек отличит Гоголя от Гегеля, Гегеля от Бебеля, Бебеля от Бабеля, Бабеля от кабеля, кабеля от кобеля, кобеля от сучки.



0



So I have been trying to learn cpp and I was writing a program, and when I try to build the solution, it gives an error saying

unexpected end of file while looking for precompiled header. Did you forget to add #include «pch.h» to your source?

Then I included it and I got the same error, and also another saying

cannot open source file pch.h

screenshot

Kuba hasn't forgotten Monica's user avatar

asked Jan 9, 2019 at 1:06

Druidswarm's user avatar

2

One option, if you are new to c++, is to just turn off pre-compiled headers in the project settings.

answered Jan 9, 2019 at 1:21

selbie's user avatar

selbieselbie

98.2k15 gold badges102 silver badges171 bronze badges

0

It needs to be the first include, you can’t place it under other includes.

answered Jul 28, 2022 at 6:32

Lionel Sanderson's user avatar

1

Your .cpp file is probably not in the same directory as pch.h

answered Aug 13, 2021 at 23:04

deanqx's user avatar

deanqxdeanqx

731 silver badge7 bronze badges

Try adding the directory that your pch.h is in to the additional includes, even if it is at the root of your project.
enter image description here

answered Oct 16, 2021 at 20:26

ZackOfAllTrades's user avatar

quick solution to a frustrating issue when trying to add .pch to an exisiting project:
if you have a /include /src dir structure, it might not work,
unless you place the «pch.h» and «pch.cpp» in the same dir /src.

Also: mark the «MyPreComp.cpp» as /Yc — create,
and in the .cpp files you want to use the .pch set them to Yu — use.

#include «pch.h» as the first #include in the .cpp

NB. You need to set «not using precompiled headers» to all .cpp files not using them,
yes, it IS a hassle.

( Visual Studio 2019 )

answered May 9, 2022 at 11:33

O.X.C's user avatar

O.X.CO.X.C

414 bronze badges

  1. It needs to be included to each cpp file (by default)
  2. It needs to be included in the very first line of your code (excluding the comments, it’s ok to have the fancy comments on top)
  3. It needs to be in a reachable directory. This error often happen when you have a folder structure in your project. So this can happen with a source files in some nested folder, when your precompile-header-file is up there in main. In this case, either add necessary number of «../» before the file name, or add the main folder to the «additional include directories» as it is already suggested above.
  4. It needs to actually be the same precompile header file, that is set as the one in project setting. Check the file with «Precompiled Header» option set to «Create (/Yc)», ensure that it refers to he same header file, that you include («pch.h» or «stdafx.h» by default) This error often happens when you include some old source to newer proj, or vice-versa, due to different default names in different studio versions: «stdafx.h» vs «pch.h».
  5. If all above is set up, and you still have it, check if you actually set it up for the right build configuration. Always apply project setting change for all configurations. Costed me some nerves when I did it for only one config, and was trying to compile another:
    Check x86 vs x64 config

answered Dec 23, 2022 at 8:52

Olexandr Chervinsky's user avatar

Время на прочтение
11 мин

Количество просмотров 316K

StdAfx.h, Precompiled headers
Статья рассчитана на людей, которые знакомятся со средой Visual Studio и пытаются компилировать в ней свои Си++-проекты. В незнакомой среде всё кажется странным и непонятным. Особенно новичков раздражает файл stdafx.h, из-за которого возникают странные ошибки во время компиляции. Очень часто всё заканчивается тем, что новичок долгое время везде старательно отключает Precompiled Headers. Чтобы помочь людям разобраться что к чему, и была написана эта статья.

Для чего нужны Precompiled Headers

Precompiled headers предназначены для ускорения сборки проектов. Обычно программисты начинают знакомиться с Visual C++, используя крошечные проекты. На них сложно заметить выигрыш от precompiled headers. Что с ними, что без них, на глаз программа компилируется одинаковое время. Это добавляет путаницы. Человек не видит для себя пользы от этого механизма и решает, что он для специфичных задач и ему никогда не понадобится. И иногда считает так многие годы.

На самом деле, precompiled headers весьма полезная технология. Пользу от него можно заметить, даже если в проекте всего несколько десятков файлов. Особенно выигрыш становится заметен, если используются такие тяжёлые библиотеки как boost.

Если посмотреть *.cpp файлы в проекте, то можно заметить, что во многие включаются одни и те-же наборы заголовочных файлы. Например, <vector>, <string>, <algorithm>. В свою очередь, эти файлы включают другие заголовочные файлы и так далее.

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

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

На самом деле, делается ещё ряд шагов. Можно хранить не просто текст, а более обработанную информацию. Я не знаю, как именно устроено в Visual C++. Но, например, можно хранить текст уже разбитый на лексемы. Это ещё больше ускорит процесс компиляции.

Как работают Precompiled Headers

Файл, который содержит precompiled headers, имеет расширение «.pch». Имя файла обычно совпадает с названием проекта. Естественно, это и другие используемые имена можно изменить в настройках. Файл может быть весьма большим и зависит от того, как много заголовочных файлов в нём раскрыто. Например, в проекте PVS-Studio он занимает около 3 мегабайт.

Файл *.pch возникает после компиляции stdafx.cpp. Файл собирается с ключом «/Yc». Этот ключ как раз и говорит компилятору, что нужно создать precompiled headers. Файл stdafx.cpp может содержать одну строчку: #include «stdafx.h».

В файле «stdafx.h» находится самое интересное. Сюда нужно включить заголовочные файлы, которые будут заранее препроцессироваться. В качестве примера, вот файл stdafx.h, используемый нами в PVS-Studio (файл сокращён для статьи):

#include "VivaCore/VivaPortSupport.h"
//For /Wall
#pragma warning(push)
#pragma warning(disable : 4820)
#pragma warning(disable : 4619)
#pragma warning(disable : 4548)
#pragma warning(disable : 4668)
#pragma warning(disable : 4365)
#pragma warning(disable : 4710)
#pragma warning(disable : 4371)
#pragma warning(disable : 4826)
#pragma warning(disable : 4061)
#pragma warning(disable : 4640)
#include <stdio.h>
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <set>
#include <map>
#include <list>
#include <deque>
#include <memory>
#pragma warning(pop) //For /Wall

Директивы «#pragma warning» нам нужны, чтобы избавиться от предупреждений, выдаваемых на стандартные библиотеки.

Теперь во все файлы *.c/*.cpp следует включить «stdafx.h». Заодно стоит удалить из этих файлов заголовки, которые уже включаются с помощью «stdafx.h».

А что делать, если используются хотя и похожие, но разные наборы заголовочных файлов? Например, такие:

  • Файл A: <vector>, <string>
  • Файл B: <vector>, <algorithm>
  • Файл C: <string>, <algorithm>

Нужно делать отдельные precompiled headers? Так сделать можно, но не нужно.

Достаточно сделать один precompiled header, в котором будут раскрыты <vector>, <string> и <algorithm>. Выигрыш от того, что при препроцессировании не надо читать множество файлов и вставлять их друг друга намного больше, чем потери на синтаксический анализ лишних фрагментов кода.

Как использовать Precompiled Headers

При создании нового проекта Wizard в Visual Studio создаёт два файла: stdafx.h и stdafx.cpp. Именно с помощью них и реализуется механизм precompiled headers.

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

В *.c/*.cpp файле можно использовать только один precompiled header. Однако, в одном проекте может присутствовать несколько разных precompiled headers. Пока будем считать, что он у нас только один.

Итак, если вы воспользовались wizard-ом, то у вас уже есть файлы stdafx.h и stdafx.cpp. Плюс выставлены все необходимые ключи компиляции.

Если в проекте не использовался механизм precompiled headers, то давайте рассмотрим, как его включить. Предлагаю следующую последовательность действий:

  1. Во всех конфигурациях для всех *.c/*.cpp файлов включаем использование precompiled headers. Это делается на вкладке «Precompiled Header»:
    1. Выставляем для параметра «Precompiled Header» значение «Use (/Yu)».
    2. Для параметра «Precompiled Header File» указываем «stdafx.h».
    3. Для параметра «Precompiled Header Output File» указываем «$(IntDir)$(TargetName).pch».
  2. Создаём и добавляем в проект файл stdafx.h. В дальнейшем, в него мы будем включать те заголовочные файлы, которые хотим заранее препроцессировать.
  3. Создаём и добавляем в проект файл stdafx.cpp. В нём одна единственная строка: #include «stdafx.h».
  4. Во всех конфигурациях меняем настройки для файла stdafx.cpp. Выставляем для параметра «Precompiled Header» значение «Create (/Yc)».

Вот мы и включили механизм precompiled headers. Теперь, если мы запустим компиляцию, то будет создан *.pch файл. Однако, затем компиляция остановится из-за ошибок.

Для всех *.c/*.cpp файлов мы указали, что они должны использовать precompiled headers. Этого мало. Теперь в каждый из файлов нужно добавить #include «stdafx.h».

Заголовочный файл «stdafx.h» должен включаться в *.c/*.cpp файл самым первым. Обязательно! Иначе всё равно возникнут ошибки компиляции.

Если подумать, в этом есть логика. Когда файл «stdafx.h» находится в самом начале, то можно подставить уже препроцессированный текст. Этот текст всегда одинаков и ни от чего не зависит.

Представьте ситуацию, если бы мы могли включить до «stdafx.h» ещё какой-то файл. А в этом файле возьмём и напишем: #define bool char. Возникает неоднозначность. Мы меняем содержимое всех файлов, в которых упоминается «bool». Теперь просто так нельзя взять и подставить заранее препроцессированный текст. Ломается весь механизм «precompiled headers». Думаю, это одна из причин, почему «stdafx.h» должен быть расположен в начале. Возможно, есть и другие.

Life hack

Прописывать #include «stdafx.h» во все *.c/*.cpp файлы достаточно утомительно и не интересно. Дополнительно получится ревизия в системе контроля версий, где будет изменено огромное количество файлов. Нехорошо.

Ещё одно неудобство вызывают сторонние библиотеки, включаемые в проект в виде файлов с кодом. Править эти файлы нет смыла. По правильному для них нужно отключить использование «precompiled headers». Однако, если используется несколько мелких сторонних библиотек, это неудобно. Программист постоянно спотыкается об precompiled headers.

Есть вариант, как использовать precompiled headers легко и просто. Способ подойдёт не везде и всегда, но мне он часто помогал.

Можно не прописывать во все файлы #include «stdafx.h», а воспользоваться механизмом «Forced Included File».

Идём на вкладку настроек «Advanced». Выбираем все конфигурации. В поле «Forced Included File» пишем:

StdAfx.h;%(ForcedIncludeFiles)

Теперь «stdafx.h» автоматически будет включаться в начало ВСЕХ компилируемых файлов. PROFIT!

Больше не потребуется писать #include «stdafx.h» в начале всех *.c/*.cpp файлов. Компилятор сделает это сам.

Что включать в stdafx.h

Это очень важный момент. Бездумное включение в «stdafx.h» всего подряд не только не ускорит компиляцию, но и наоборот замедлит её.

Все файлы, включающие «stdafx.h», зависят от его содержимого. Пусть в «stdafx.h» включен файл «X.h». Если вы поменяете хоть что-то в «X.h», это может повлечь полную перекомпиляцию всего проекта.

Правило. Включайте в «stdafx.h» только те файлы, которые никогда не изменяются или меняются ОЧЕНЬ редко. Хорошими кандидатами являются заголовочные файлы системных и сторонних библиотек.

Если включаете в «stdafx.h» собственные файлы из проекта, соблюдайте двойную бдительность. Включайте только те файлы, которые меняются очень-очень редко.

Если какой-то *.h файл меняется раз в месяц, это уже слишком часто. Как правило, редко удаётся сделать все правки в h-файле с первого раза. Обычно требуется 2-3 итерации. Согласитесь, 2-3 раза полностью перекомпилировать весь проект — занятие неприятное. Плюс полная перекомпиляция потребуется всем вашим коллегам.

Не увлекайтесь с неизменяемыми файлами. Включайте только то, что действительно часто используется. Нет смысла включать <set>, если это нужно только в двух местах. Там, где нужно, там и подключите этот заголовочный файл.

Несколько Precompiled Headers

Зачем в одном проекте может понадобиться несколько precompiled headers? Действительно, это нужно не часто. Но приведу пару примеров.

В проекте используются одновременно *.c и *.cpp файлы. Для них нельзя использовать единый *.pch файл. Компилятор выдаст ошибку.

Нужно создать два *.pch файла. Один должен получаться при компилировании C-файла (xx.c), а другой при компилировании C++-файла (yy.cpp). Соответственно, в настройках надо указать, чтобы в С-файлах использовался один precompiled header, а в С++-файлах — другой.

Примечание. Не забудьте указать разные имена для *.pch файлов. Иначе один файл будет перетирать другой.

Другая ситуация. Одна часть проекта использует одну большую библиотеку, а другая часть другую большую библиотеку.

Естественно, не стоит всем участкам кода знать про обе библиотеки. В (неудачных) библиотеках могут пересекаться имена каких-то сущностей.

Логично сделать два precompiled headers и использовать их в разных участках программы. Как уже отмечалось, можно задать произвольные имена файлов, из которых генерируются *.pch файлы. Да и имя *.pch файла тоже можно изменить. Всё это, конечно, требуется делать аккуратно, но ничего сложного в использовании двух precompiled headers нет.

Типовые ошибки при использовании Precompiled Headers

Прочитав внимательно материал выше, вы сможете понять и устранить ошибки, связанные с stdafx.h. Но давайте ещё раз пройдёмся по типовым ошибкам компиляции и разберём их причины. Повторенье — мать ученья.

Fatal error C1083: Cannot open precompiled header file: ‘Debugproject.pch’: No such file or directory

Вы пытаетесь скомпилировать файл, который использует precompiled header. Но соответствующий *.pch файл отсутствует. Возможные причины:

  1. Файл stdafx.cpp не компилировался и, как следствие, *.pch файл ещё не создан. Такое может быть, если, например, в начале очистить проект (Clean Solution), а потом попробовать скомпилировать один *.cpp файл (Compile Ctrl-F7). Решение: скомпилируйте проект целиком или как минимум файл stdafx.cpp.
  2. В настройках ни указано ни одного файла, из которого должен генерироваться *.pch файл. Речь идёт о ключе компиляции /Yc. Как правило, такая ситуация возникает у начинающих, которые захотели использовать precompiled headers для своего проекта. Как это сделать описано выше в разделе «Как использовать Precompiled Headers».

Fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add ‘#include «stdafx.h»’ to your source?

Сообщение говорит само за себя, если его прочитать. Файл компилируется с ключом /Yu. Это значит, что следует использовать precompiled header. Но в файл не включён «stdafx.h».

Нужно вписать в файл #include «stdafx.h».

Если это невозможно, то следует не использовать precompiled header для этого *.c/*.cpp файла. Уберите ключ /Yu.

Fatal error C1853: ‘project.pch’ precompiled header file is from a previous version of the compiler, or the precompiled header is C++ and you are using it from C (or vice versa)

В проекте присутствуют как C (*.c), так и C++ (*.cpp) файлы. Для них нельзя использовать единый precompiled header (*.pch файл).

Возможные решения:

  1. Отключить для всех Си-файлов использование precompiled headers. Как показывает практика, *.с файлы препроцессируются в несколько раз быстрее, чем *.cpp файлы. Если *.c файлов не очень много, то, отключив precompiled headers для них, вы ничего не потеряете
  2. Завести два precompiled headers. Первый должен создаваться из stdafx_cpp.cpp, stdafx_cpp.h. Второй из stdafx_c.c, stdafx_c.h. Соответственно, в *.c и *.cpp файлах следует использовать разные precompiled headers. Имена *.pch файлов естественно тоже должны различаться.

Из-за precompiled header компилятор глючит

Скорее всего, что-то сделано не так. Например, #include «stdafx.h» расположен не в самом начале.

Рассмотрим пример:

int A = 10;
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[]) {
  return A;
}

Этот код не скомпилируется. Компилятор выдаст на первый взгляд странное сообщение об ошибке:

error C2065: 'A' : undeclared identifier

Компилятор считает, что все, что указано до строчки #include «stdafx.h» (включительно), является precompiled header. При компиляции файла компилятор заменит все, что до #include «stdafx.h» на текст из *.pch файла. В результате теряется строчка «int A = 10».

Правильный вариант:

#include "stdafx.h"
int A = 10;
int _tmain(int argc, _TCHAR* argv[]) {
  return A;
}

Ещё пример:

#include "my.h"
#include "stdafx.h"

Содержимое файла «my.h» не будет использоваться. В результате, нельзя будет использовать функции, объявленные в этом файле. Такое поведение очень сбивает программистов с толку. Они «лечат» его полным отключением precompiled headers и потом рассказывают байки о глючности Visual C++. Запомните, компилятор — это один из наиболее редко глючащих инструментов. В 99.99% случаев надо не злиться на компилятор, а искать ошибку у себя (Proof).

Чтобы таких ситуаций не было, ВСЕГДА пишите #include «stdafx.h» в самом начале файла. Комментарии перед #include «stdafx.h» можно оставить. Они всё равно никак не участвуют в компиляции.

Ещё один вариант — используйте Forced Included File. См. выше раздел «Life hack».

Из-за precompiled headers проект постоянно перекомпилируется целиком

В stdafx.h включён файл, который регулярно редактируется. Или случайно включён автогенерируемый файл.

Внимательно проверьте содержимое файла «stdafx.h». В него должны входить только заголовочные файлы, которые не изменяются или изменяются крайне редко. Учтите, что включённые файлы могут не меняться, но внутри они ссылаются на другие изменяющиеся *.h файлы.

Творится что-то непонятное

Иногда может возникнуть ситуация, что вы поправили код, а ошибка не исчезает. Отладчик показывает непонятные вещи.

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

Это ОЧЕНЬ редкая ситуация. Но она возможна и про неё надо знать. Я за многие годы программирования сталкивался с ней только 2-3 раза. Помогает полная перекомпиляция проекта.

Проект, использующий precompiled headers не удаётся проверить с помощью PVS-Studio

Это наиболее частая ситуация, с которой к нам обращаются в поддержку. Подробности изложены в документации: «Устранение неисправностей при работе PVS-Studio». Здесь опишу ситуацию кратко.

Если решение (solution) компилируется, это вовсе не значит, что оно правильно устроено. Часто одно решение (solution) содержит множество проектов. В каждом проекте используются свои precompiled headers (имеется свой stdafx.h и stdafx.cpp).

Возникают проблемы, когда начинают использовать файлы из соседнего проекта. Это удобно и так часто делается. Вот только забывают, что в *.cpp файле написано: #include «stdafx.h».

И, какой из stdafx.h подхватится, это интересный вопрос. Но раз программа компилируется — программисту везёт.

К сожалению, нам сложно повторить поведение, которое возникает при использовании *.pch файла. «Честный» препроцессор работает по-другому.

В том, что solution, на самом деле, устроен не верно, можно убедиться, временно отключив precompiled headers. Сразу может вылезти масса интересных ошибок, и программист будет искренне удивляться, каким же чудом компилировался его проект.

За подробностями вновь делаю отсылку к документации. Плюс, если что-то всё равно не ясно, мы подскажем в поддержке.

Заключение

Как вы увидели, ничего сложного в precompiled headers нет. Все «многочисленные глюки компилятора», с которыми сталкивается программист при их использовании, на самом деле, являются непониманием принципов работы. Надеюсь, эта статья поможет устранить непонимание.

Precompiled headers являются очень полезным механизмом, позволяющим существенно увеличить скорость компиляции проектов.

Я компилирую следующий код, но получаю ошибку компиляции в Visual Studio, которую не могу понять.

«wordcount.cpp (57): фатальная ошибка C1010: неожиданный конец файла при поиске предварительно скомпилированного заголовка. Вы забыли добавить ‘#include» stdafx.h «‘ в исходный код?»

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

Решение

Отключить предварительно скомпилированные заголовки:

задавать Precompiled Header в «Not Using Precompiled Header» ,

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

Первая строка каждого исходного файла вашего проекта должна быть следующей:

Визит Вот чтобы понять Предварительно скомпилированные заголовки

Создать новый «Пустой проектMsgstr «, добавьте ваш Cpp файл в новый проект, удалите строку, содержащую stdafx.

Проект больше не нуждается в stdafx. Он добавляется автоматически при создании проектов с установленными шаблонами.

непредвиденный конец файла при поиске предкомпилированного заголовка. unexpected end of file while looking for precompiled header. Вы забыли добавить имя«#include» в источник? Did you forget to add ‘#include name‘ to your source?

Включаемый файл, указанный параметром /Yu , отсутствует в файле исходного кода. An include file specified by /Yu isn’t listed in the source file. Этот параметр включен по умолчанию во многих типах проектов C++ Visual Studio. This option is enabled by default in many Visual Studio C++ project types. Файл включения по умолчанию, заданный этим параметром, — PCH. hили stdafx. h в Visual Studio 2017 и более ранних версий. The default include file specified by this option is pch.h, or stdafx.h in Visual Studio 2017 and earlier.

В среде Visual Studio используйте один из следующих методов, чтобы устранить эту ошибку: In the Visual Studio environment, use one of the following methods to resolve this error:

Убедитесь, что вы случайно не удалили, не переименовали или удалили файл заголовка PCH. h или исходный файл PCH. cpp из текущего проекта. Make sure you haven’t inadvertently deleted, renamed, or removed the pch.h header file or pch.cpp source file from the current project. (В более старых проектах эти файлы могут называться stdafx. h и stdafx. cpp.) (In older projects, these files may be named stdafx.h and stdafx.cpp.)

Убедитесь, что заголовочный файл PCH. h или stdafx. h включен перед любыми другими директивами кода или препроцессора в исходных файлах. Make sure the pch.h or stdafx.h header file is included before any other code or preprocessor directives in your source files. (В Visual Studio этот заголовочный файл задается свойством проекта файла предкомпилированного заголовка .) (In Visual Studio, this header file is specified by the Precompiled Header File project property.)

Вы можете отключить использование предкомпилированного заголовка. You can turn off precompiled header use. Если отключить предварительно скомпилированные заголовки, это может серьезно повлиять на производительность сборки. If you turn off precompiled headers, it may severely impact build performance.

Чтобы отключить использование предкомпилированного заголовка в проекте, выполните следующие действия. To turn off precompiled header use in a project, follow these steps:

В окне Обозреватель решений щелкните правой кнопкой мыши имя проекта и выберите пункт свойства , чтобы открыть диалоговое окно страницы свойств проекта. In the Solution Explorer window, right-click the project name, and then choose Properties to open the project Property Pages dialog.

В раскрывающемся списке Конфигурация выберите все конфигурации. In the Configuration drop-down, select All Configurations.

Выберите страницу свойств Свойства > конфигурацииCC++/ > Предкомпилированные заголовки . Select the Configuration properties > C/C++ > Precompiled Headers property page.

В списке свойств выберите раскрывающийся список для свойства предкомпилированного заголовка , а затем выберите вариант не использовать предкомпилированные заголовки. In the property list, select the drop-down for the Precompiled Header property, and then choose Not Using Precompiled Headers. Выберите ОК для сохранения внесенных изменений. Choose OK to save your changes.

При компилировании этого кода:

fatal error C1010: непредвиденный конец файла во время поиска предкомпилированного заголовка. Возможно, вы забыли добавить директиву «#include «pch.h»» в источник.

Почему так — непонятно. Все библиотеки подключил. (Работал в VS)

Закрыт по причине того, что не по теме участниками user7860670, 0xdb, aleksandr barakin, Эникейщик, Eugene Krivenja 21 янв в 16:21 .

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

  • «Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.» – aleksandr barakin, Эникейщик, Eugene Krivenja
  • «Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.» – user7860670, 0xdb

Если вопрос можно переформулировать согласно правилам, изложенным в справке, отредактируйте его.

Понравилась статья? Поделить с друзьями:
  • Pc speaker коды ошибок
  • Pc radio ошибка при подключении проверьте настройки
  • Pc connect realme ошибка
  • Pc building simulator ошибка 3dmark
  • Pc analyzer коды ошибок на русском