VS 2005 не обнаруживает изменений в заголовочных файлах проекта C ++ - PullRequest
4 голосов
/ 21 октября 2009

Очень часто, в большинстве случаев Visual Studio2005 не обнаруживает что какой-то заголовок, включенный в какой-либо CPP-файл C ++ проекта, был изменен. Как следствие, он не перекомпилирует проект, если изменяется только заголовок.

Не зависит от настроек «скомпилированных заголовков». Это не происходит в VS 2006, но в каждой версии VS 2005 и VS 2008 это происходит. Это происходит для всех проектов, а не для какого-то конкретного.

Это не происходит, если заголовочный файл является частью проекта, то есть если он появляется в файле vcproj

Единственный способ решить проблему - выполнить чистую сборку.

Любой совет настоятельно приветствуется.

Ответы [ 3 ]

3 голосов
/ 21 октября 2009

В большинстве случаев (особенно в проектах C) это происходит из-за настройки проекта «Включить минимальное перестроение». В режиме «минимального перестроения» VS2005 пытается принимать более точные решения относительно того, что нужно перестраивать: не на основе того, какие файлы заголовков были изменены, а скорее на основе того, какие отдельные определения класса были изменены . В проектах C (в отличие от проектов C ++) этот подход в большинстве случаев дает сбой 100% времени, то есть он полностью игнорирует измененные заголовочные файлы и никогда ничего не перестраивает. Очень надоедливый. Я не знаю, какой проект вы создаете, но, возможно, он может не сработать и в проектах C ++.

В любом случае, попробуйте установить «Включить минимальное перестроение» на «Нет». (Это настройка проекта, кстати, а не глобальная настройка VS). Это должно вернуть VS к традиционному поведению восстановления на основе файлов.

2 голосов
/ 21 октября 2009

Прежде всего VS проверяет только те заголовки, которые являются частью вашего проекта (включены в файл проекта / часть дерева файлов).

Есть некоторые заголовочные файлы, которые обрабатываются особым образом, например, resource.h. Этот файл имеет тег комментария в начале, который определяет файл как независимый. Смотрите мой другой вопрос об этой проблеме здесь на SO.

VS также кэширует зависимости класса (какой класс объявлен в каком заголовке, какой cpp использует какой заголовок и т. Д.), Если вы используете опцию компилятора минимальное перестроение (/ Gm, если я правильно помню). См. Эту страницу MSDN по настройке компилятора / Gm для более подробной информации, например:

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

Кроме того, я не уверен, правильно ли разрешены зависимости, если вы используете force include настройки проекта ...

Надеюсь, что это было полезно.

0 голосов
/ 21 марта 2019

Я только столкнулся с этой проблемой - оказывается, я скопировал папку проекта VS (очень плохая идея) и продолжил работу над копией моего проекта. Но поскольку все пути включения и т. Д. Все еще указывали на исходный проект (глупый VS для использования абсолютных путей ...), VS «не обнаружил» изменения заголовка, другими словами, искал неправильное местоположение включения.

...