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

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

  • автор:

Для новичков про stdafx.h

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 (файл сокращён для статьи):

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

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

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

Достаточно сделать один 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. Плюс выставлены все необходимые ключи компиляции.

  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».

    Для всех *.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» автоматически будет включаться в начало ВСЕХ компилируемых файлов. 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: ‘Debug\project.pch’: No such file or directory

    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» расположен не в самом начале.

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

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

    Содержимое файла «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 являются очень полезным механизмом, позволяющим существенно увеличить скорость компиляции проектов.

    How to avoid precompiled headers

    I am trying to compile a simple VS program in C++ as an assignment for class. We only ever include <iostream> and I keep getting this error:

    1>Assignment.cpp(15): fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add ‘#include «StdAfx.h»‘ to your source?

    My program is literally this small.

    I just installed Visual Studio Express 2010. Really I would love to start an empty project instead of installing with all these files predefined, I think it would make it a lot easier but I never get that option when creating a project. Anybody have any suggestions?

    0.7 – Компиляция вашей первой программы

    Прежде чем мы сможем написать нашу первую программу, нам нужно научиться создавать новые программы в нашей интегрированной среде разработки (IDE). В этом уроке мы расскажем, как это сделать, а вы скомпилируете и запустите свою первую программу!

    Проекты

    Чтобы написать программу на C++ внутри IDE, мы обычно начинаем с создания нового проекта (мы покажем вам, как это сделать чуть позже). Проект – это контейнер, в котором хранятся все файлы исходного кода, изображения, файлы данных и т.д., которые необходимы для создания исполняемого файла (или библиотеки, веб-сайта и т.д.), который вы сможете запускать или использовать. Проект также сохраняет различные настройки IDE, компилятора и компоновщика, а также запоминает, где вы остановились, чтобы позже, при повторном открытии проекта состояние IDE можно было восстановить с того места, где вы остановились. Когда вы решите скомпилировать свою программу, все файлы .cpp в проекте будут скомпилированы и слинкованы.

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

    Лучшая практика

    Создавайте новый проект для каждой новой программы, которую вы пишете.

    Консольные проекты

    Когда вы создаете новый проект, вас обычно спрашивают, проект какого типа вы хотите создать. Все проекты, которые мы создадим в этом руководстве, будут консольными. Консольный проект означает, что мы собираемся создавать программы, которые можно запускать из консоли Windows, Linux или Mac.

    Ниже показан скриншот консоли Windows:

    Рисунок 1 Консоль Windows Рисунок 1 – Консоль Windows

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

    Не беспокойтесь, если вы никогда раньше не пользовались консолью или не знаете, как получить к ней доступ. Мы будем компилировать и запускать наши программы через наши IDE (которые при необходимости будут вызывать консоль).

    Рабочие пространства / решения

    Когда вы создаете новый проект для своей программы, многие IDE автоматически добавляют ваш проект в «рабочее пространство» («workspace» или «solution») (термин зависит от IDE). Рабочее пространство – это контейнер, который может содержать один или несколько связанных проектов. Например, если вы пишете игру и хотите иметь отдельные исполняемые файлы для одиночной и многопользовательской игры, вам нужно будет создать два проекта. Обоим этим проектам не имело бы смысла быть полностью независимыми – в конце концов, они являются частью одной игры. Скорее всего, каждый из них будет настроен как отдельный проект в рамках одного рабочего пространства.

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

    Написание вашей первой программы

    Традиционно у программистов, пишущих на новом языке, первой программой является печально известная программа hello world, и мы не собираемся лишать вас этого опыта! Вы нас потом поблагодарите. Может быть.

    Создание проекта в Visual Studio 2019

    Когда вы запустите Visual Studio 2019, вы должны увидеть диалоговое окно, которое выглядит следующим образом:

    Рисунок 2 Диалоговое окно Начало работы Visual Studio 2019 Рисунок 2 – Диалоговое окно «Начало работы» Visual Studio 2019

    Выберите Создание проекта (Create a new project).

    После этого вы увидите диалоговое окно, которое выглядит следующим образом:

    Рисунок 3 Visual Studio 2019: диалоговое окно создания нового проекта Рисунок 3 – Visual Studio 2019: диалоговое окно создания нового проекта

    Если вы уже открыли предыдущий проект, вы можете открыть это диалоговое окно через меню Файл (File) → Создать (New) → Проект (Project).

    Выберите Мастер классических приложений Windows (Windows Desktop Wizard) и нажмите Далее (Next). Если вы этого не видите, то вы, вероятно, при установке Visual Studio забыли выбрать установку Desktop development with C++. В этом случае вернитесь к уроку «0.6 – Установка интегрированной среды разработки (IDE)» и переустановите Visual Studio, как было показано (примечание: вместо полной переустановки вы можете запустить установщик Visual Studio и изменить существующую установку, чтобы добавить поддержку C++).

    Далее вы увидите диалоговое окно, которое выглядит следующим образом:

    Рисунок 4 Диалоговое окно настройки нового проекта Visual Studio 2019 Рисунок 4 – Диалоговое окно настройки нового проекта Visual Studio 2019

    Замените существующее имя проекта на HelloWorld .

    Рекомендуется также установить флажок «Поместить решение и проект в одном каталоге» (Place solution and project in the same directory), поскольку это сокращает количество подкаталогов, создаваемых с каждым проектом.

    Нажмите Создать (Create), чтобы продолжить.

    Наконец, вы увидите последнее диалоговое окно:

    Рисунок 5 Диалоговое окно параметров проекта Visual Studio 2019 Рисунок 5 – Диалоговое окно параметров проекта Visual Studio 2019

    Убедитесь, что тип приложения установлен как Консольное приложение (.exe) (Console Application (.exe)), и что параметр Предкомпилированный заголовок (Precompiled Header) не выбран. Затем нажмите ОК.

    Вы создали проект! Чтобы продолжить, перейдите в раздел Обозреватель решений Visual Studio ниже.

    Создание проекта в Visual Studio 2017 или в более ранней версии

    Чтобы создать новый проект в Visual Studio 2017 или более ранней версии, выберите меню Файл (File) → Создать (New) → Проект (Project). Появится диалоговое окно, которое выглядит примерно так:

    Рисунок 6 Диалоговое окно Новый проект Visual Studio 2017 Рисунок 6 – Диалоговое окно «Новый проект Visual Studio 2017»

    Сначала убедитесь, что слева указан Visual C++. Если вы не видите Visual C++, возможно, вы забыли выбрать установку поддержку Desktop development with C++ при установке Visual Studio. В этом случае вернитесь к уроку «0.6 – Установка интегрированной среды разработки (IDE)» и переустановите Visual Studio, как было показано (примечание: вместо полной переустановки вы можете запустить установщик Visual Studio и изменить существующую установку, чтобы добавить поддержку C++).

    Если вы используете Visual Studio 2017 v15.3 или новее, под Visual C++ выберите Windows Desktop, а затем выберите Windows Desktop Wizard в главном окне.

    Если вы не видите вариант с Windows Desktop, возможно, вы используете старую версию Visual Studio. Отлично. Вместо этого выберите Win32, а затем Win32 Console Application в главном окне.

    Внизу в поле Name введите название своей программы (замените существующее имя на HelloWorld ). В поле Location вы можете при желании выбрать другое место для размещения вашего проекта. Пока подойдет и значение по умолчанию.

    Нажмите ОК. Если вы используете старую версию Visual Studio, запустится мастер приложений Win32. Нажмите Next.

    На этом этапе вы должны увидеть диалоговое окно мастера, которое выглядит примерно так (более старые версии Visual Studio используют другой стиль, но имеют большинство из тех же параметров):

    Рисунок 7 Мастер создания десктопного приложения Visual Studio 2017 Рисунок 7 – Мастер создания десктопного приложения Visual Studio 2017

    Убедитесь, что вы сняли флажок Предкомпилированный заголовок (Precompiled Header).

    Затем нажмите ОК или Finish. Теперь ваш проект создан!

    Обозреватель решений Visual Studio

    В левой или правой части окна вы должны увидеть окно под названием Обозреватель решений. В этом окне Visual Studio создала для вас решение (решение "HelloWorld"). Внутри него, имя которого выделено жирным шрифтом, находится ваш новый проект ( HelloWorld ). Visual Studio создала для вас в этом проекте ряд файлов, в том числе HelloWorld.cpp (в элементе дерева Исходные файлы (Source Files)). Вы также можете увидеть некоторые другие файлы .cpp или .h, которые пока можете игнорировать.

    Рисунок 8 Начальные окна Visual Studio 2019 Рисунок 8 – Начальные окна Visual Studio 2019

    В текстовом редакторе вы увидите, что Visual Studio уже открыла HelloWorld.cpp и создала для вас код. Выделите и удалите весь код и введите/скопируйте следующий код в вашу IDE:

    Чтобы скомпилировать программу, либо нажмите F7 (если это не сработает, попробуйте Ctrl + Shift + B ), либо перейдите в меню Сборка (Build) → Собрать решение (Build Solution). Если всё пойдет хорошо, вы должны увидеть следующее в окне вывода:

    Или, в зависимости от выбранного языка:

    Это означает, что ваша компиляция прошла успешно!

    Вопрос: У меня вылетела ошибка C1010 ("fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?"). Что теперь?

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

    Чтобы запустить скомпилированную программу, нажмите Ctrl + F5 или перейдите в меню Отладка (Debug) и выберите Запуск без отладки (Start Without Debugging). Вы увидите следующее:

    Рисунок 9 Запуск программы Рисунок 9 – Запуск программы

    Это результат выполнения вашей программы! Поздравляем, вы скомпилировали и запустили свою первую программу!

    Создание проекта в Code::Blocks

    Чтобы создать новый проект, перейдите в меню File (Файл) → New (Новый) → Project (Проект). Появится диалоговое окно, которое выглядит следующим образом:

    Рисунок 10 Code::Blocks. Диалоговое окно создания проекта Рисунок 10 – Code::Blocks. Диалоговое окно создания проекта

    Выберите Console application (консольное приложение) и нажмите кнопку Go (перейти/создать).

    Если вы видите диалоговое окно мастера консольного приложения, нажмите Next (далее), убедитесь, что выбран C++, и снова нажмите Next.

    Теперь вам будет предложено назвать ваш проект. Назовите проект HelloWorld . Вы можете сохранить его где угодно. В Windows мы рекомендуем сохранить его в подкаталоге диска C, например C:\CBProjects .

    Рисунок 11 Code::Blocks. Диалогове окно сохранения проекта Рисунок 11 – Code::Blocks. Диалогове окно сохранения проекта

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

    Теперь ваш новый проект создан.

    В левой части экрана вы должны увидеть окно Management (управление) с выбранной вкладкой Projects (проекты). Внутри этого окна вы увидите папку Workspace с вашим проектом HelloWorld внутри:

    Рисунок 12 Code::Blocks. Workspace Рисунок 12 – Code::Blocks. Workspace

    Внутри проекта HelloWorld разверните папку Sources (исходники) и дважды щелкните на « main.cpp ». Вы увидите, что для вас уже написана программа hello world!

    Замените ее следующим кодом:

    Чтобы собрать проект, нажмите Ctrl + F9 или перейдите в меню Build (Сборка) → Build (Сборка). Если всё пойдет хорошо, вы должны увидеть следующее в окне журнала сборки:

    Это означает, что компиляция прошла успешно!

    Чтобы запустить скомпилированную программу, нажмите Ctrl + F10 или перейдите в меню Build (Сборка) → Run (Запуск). Вы увидите что-то похожее на следующий скриншот:

    Рисунок 13 Запуск программы Рисунок 13 – Запуск программы

    Это результат выполнения вашей программы!

    Для пользователей Linux

    Пользователям Linux до компиляции в Code::Blocks может потребоваться установить дополнительные пакеты. Дополнительные сведения смотрите в инструкциях по установке Code::Blocks в уроке «0.6 – Интегрированная среда разработки (IDE)».

    Если вы используете g++ из командной строки

    В этом случае создавать проект не нужно. Просто вставьте следующий код в текстовый файл с именем HelloWorld.cpp и сохраните файл:

    В командной строке введите:

    Это скомпилирует и слинкует HelloWorld.cpp . Чтобы запустить скомпилированную программу, введите:

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

    Если вы используете другие IDE или веб-компилятор

    Вам нужно будет самостоятельно выяснить, как сделать следующее:

    1. создать консольный проект (только для IDE);
    2. добавить в проект файл .cpp (только для IDE, если он для вас не был создан автоматически);
    3. вставить в файл следующий код:
    4. скомпилировать проект;
    5. запустить проект.

    Если компиляция завершилась ошибкой

    Ничего страшного, сделайте глубокий вдох. Вероятно, мы сможем это исправить. 🙂

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

    Во-вторых, посмотрите вопросы и ответы в уроке «0.8 – Несколько распространенных проблем C++», поскольку ваша проблема может быть там освещена.

    В-третьих, прочтите комментарии ниже – кто-то мог столкнуться с той же проблемой.

    Наконец, если всё вышеперечисленное не помогло, попробуйте поискать сообщение об ошибке в Google. Скорее всего, кто-то уже сталкивался с этим раньше и придумал, как это исправить.

    Если ваша программа запускается, но окно мигает и сразу закрывается

    Некоторые IDE автоматически не приостанавливают экран консоли после завершения выполнения программы. Ваша программа запускается, но окно вывода закрывается, прежде чем вы сможете просмотреть результаты.

    Если это так с вашей IDE, следующие два шага решат вашу проблему:

    Сначала добавьте или убедитесь, что следующие строки находятся в верхней части вашей программы (пользователи Visual Studio должны убедиться, что эти строки появляются после #include "pch.h" или #include "stdafx.h" , если таковые существуют):

    Во-вторых, добавьте следующий код в конец функции main() (непосредственно перед оператором return ):

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

    Другие решения, такие как обычно предлагаемое system("pause") , могут работать только в определенных операционных системах, и их следует избегать.

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

    Для пользователей Visual Studio

    Visual Studio не будет в конце делать паузу в работе консольного приложения, если оно запускается с отладкой (меню Отладка (Debug) → Начать отладку (Start Debugging)). Если вы хотите, чтобы она сделала паузу, вы можете либо использовать приведенное выше решение с дополнительным кодом, либо запустить свою программу без отладки (меню Отладка (Debug) → Начать отладку (Start Without Debugging)).

    Заключение

    Поздравляем, вы прошли самую сложную часть этого руководства (установку IDE и компиляцию вашей первой программы)!

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

    Когда я хочу отключить «предварительно скомпилированный заголовок»? в визуальной студии?

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

    Я читаю документацию Boost и вижу, что в инструкциях говорится:

    В Свойства конфигурации> C / C ++> Предварительно скомпилированные заголовки измените параметр Использовать предварительно скомпилированный заголовок (/ Yu) на Не использовать предварительно скомпилированные заголовки.

    И тогда они объясняют это:

    Нет проблем с использованием Boost с предварительно скомпилированными заголовками; эти инструкции просто избегают предварительно скомпилированных заголовков, потому что для этого потребуются специфические для Visual Studio изменения исходного кода, используемого в примерах.

    1. Могут ли некоторые объяснить мне предложение, которое я выделил жирным шрифтом? о каких специфических изменениях в визуальной студии они говорят? (Вот ссылка на документацию, которую я читаю: http://www.boost.org/doc/libs/1_55_0/more/getting_started/windows.html#pch )
    2. Почему и когда я хочу отключить предварительно скомпилированные заголовки?
    3. В чем разница между «Создать» и «Использовать» в предварительно скомпилированных заголовках.

    Решение

    Первоначально комментарий, но я могу также опубликовать его. Примечание: это относится к VC ++:

    Смелое предложение — их способ сказать, что образцы не следуют мантре унифицированной модели «используй этот заголовок для pch-поколения». Итак, их образцы не подходят для PCH, но вы все равно можете использовать pch с boost в ваших проектах, если они правильно настроены.

    Вы бы отключили их по разным причинам. Некоторые исходные модули, особенно сторонние, не следуют модели PCH, включающей в себя «pch-through-header» с самого начала. Их образцы представляют собой такой код (и, следовательно, советуют отключить их для их образцов). Иногда исходные файлы требуют разных конфигураций препроцессора только для этих файлов, а не для всех файлов в проекте; Еще одна причина отключить PCH для этих файлов.

    Вы обычно используете пара источник / заголовок для генерации «Единого»; предварительно скомпилированное изображение заголовка. Этот заголовочный файл обычно включает в себя:

    1. Любые системные стандартные заголовки lib, используемые вашим проектом
    2. Сторонние заголовки SDK
    3. Почти все остальное, что НЕ находится в активной разработке для ваш проект.

    Единственный исходный файл, помеченный как Создайте обычно включает в себя одну строку кода: #include «YourHeaderFile.h» , где YourHeaderFile.h это заголовок, который вы заполнили материалом из списка выше. Отметить его как «Создать» через заголовок YourHeaderFile.h сообщает VC, что это файл, необходимый для восстановления PCH через этот заголовок при компиляции других исходных файлов. Все остальные исходные файлы помечены как использование (кроме тех, где PCH выключен) и должен включать, как их первый строка кода, то же самое #include «TheHeaderFile.h» ,

    Короче говоря (трудно поверить), <boost> говорит, что их образцы не настроены, как описано выше, и поэтому вы должны включить PCH от при их строительстве.

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

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

    Все до #pragma переходит в предварительно скомпилированный заголовок Все после этого зависит от предварительно скомпилированного заголовка. Специфическая «магия» VC ++ для работы скомпилированного заголовка заключается в том, что #pragma ,

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

    Это приводит к (как правило) созданию одного заголовка, который включает в себя все другие общие заголовки и имеет #pragma hdrstop прямо в его конце, затем включив его во все остальные исходные файлы.

    Затем, когда компилятор делает свое дело, есть две фазы: сначала нужно создать предварительно скомпилированный заголовок. Это означает запуск компилятора с одним переключателем. Компилятор только смотрит на то, что приходит до #pragma hdrstop создает таблицу символов (и тому подобное) и помещает данные в .pch файл.

    Затем наступает этап, когда вы делаете сборку с использованием предварительно скомпилированного заголовка. На этом этапе компилятор просто игнорирует все в файле до #pragma hdrstop , Когда он доходит до этого, он читает внутреннее состояние компилятора из .pch файл, а затем начинает компилировать этот отдельный файл.

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

    Другими словами, хотя единственная часть, которая абсолютно требуется это #pragma hdrstop , что довольно безобидно, для их извлечения требуется гораздо больше реструктуризации файлов — и эти изменения могут быть очень вредными для времени компиляции, если вы используете что-то, что не поддерживает предварительно скомпилированные заголовки (и VC ++ делает то же самое).

    Когда прекомпилированные заголовки есть в каждом cpp, исходный файл должен начинаться с #include «stdafx.h»

    Так что вы бы отключили его, если не хотите редактировать все исходные файлы.

Добавить комментарий

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