VS2010 не обрабатывает «включает в себя» в условиях препроцессора правильно

У меня довольно большое решение VS2010 C ++. В решении только один проект, поэтому между проектами нет взаимозависимостей. Проблема в том, что когда я вытаскиваю обновление из GIT, VS2010 иногда недостаточно умен, чтобы перестраивать единицы перевода, на которые будут влиять новые файлы, которые были обновлены. Это приводит к тому, что исполняемый файл неизбежно падает каким-то поддельным способом.

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

ПРИМЕЧАНИЕ: я ни в коем случае не виню мерзавца, я просто указываю на мой процесс на случай, если он уместен.
ТАКЖЕ ПРИМЕЧАНИЕ: Когда я строю, я щелкаю правой кнопкой мыши по проекту и выбираю «Build».

Кто-нибудь знает способ «отладки» этого компилятора, чтобы знать, почему он не замечает, что ему нужно пересобрать другие файлы, которые зависят от изменений?

РЕДАКТИРОВАТЬ: После дальнейшего расследования я могу исключить использование GIT в качестве проблемы. Я могу воспроизвести это, отредактировав файл заголовка, который включен во многие места, сохраните его и затем запустите «Build», который не хочет создавать какие-либо новые файлы.

РЕДАКТИРОВАТЬ 2: Кажется, проблема связана с #defines. У меня есть заголовок, который включается только в ДРУГОЙ заголовок … и он включается в этот заголовок только при некоторых условиях, которые определены #defines. Итак, у нас есть #if COND1 #elif COND2 #else < заголовок проблемы в вопросе #endif, и он сломан. Если я беру включение из остального случая, оно вызывает зависимости для правильной компиляции!

0

Решение

Я не знаю ни git, ни VS2010, но когда я видел такое поведение с системами на основе make, обычно это происходит потому, что система контроля версий извлекает файл и дает ему время, в которое он был зафиксирован (или даже время модификации, которое было у него) когда это было совершено). Затем система сборки думает, что исходный файл все еще старше, чем объектный файл, и не может перестроить материал.

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

Я подозреваю, что это решит проблему для вас.

1

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

Если проблема заключается в том, что, как вы говорите в EDIT2, файл заголовка не обнаружен средством проверки зависимостей VS, вы можете решить его следующим способом:

  • Получить копию touch а также test утилиты для Windows (например, из Сайт GNUWin32.
  • Напиши команда предварительной сборки это копирует время модификации из отслеживаемого заголовка в отслеживаемый, но только если он более новый:

Что-то вроде:

test.exe untracked.h -nt tracked.h && touch.exe -r untracked.h tracked.h

PS: Может быть, вы можете написать ту же идею, используя PowerShell, но я не знаю как.

0