Visual Studio 2010 всегда думает, что проект устарел, но ничего не изменилось - PullRequest
191 голосов
/ 04 мая 2010

У меня очень похожая проблема, как описано здесь .

Я также обновил смешанное решение проектов C ++ / CLI и C # с Visual Studio 2008 до Visual Studio 2010. И теперь в Visual Studio 2010 один проект C ++ / CLI всегда устаревает.

Даже если он был скомпилирован и скомпонован непосредственно перед этим, и F5 нажата, появляется сообщение «Проект устарел. Вы хотите его построить?» появляется. Это очень раздражает, потому что файл DLL очень низкоуровневый и вынуждает перестраивать практически все проекты решения.

Для моих настроек pdb установлено значение по умолчанию ( предлагает решение этой проблемы ).

Возможно ли выяснить причину, по которой Visual Studio 2010 принудительно перестраивает или считает, что проект обновлен?

Есть еще идеи, почему Visual Studio 2010 ведет себя так?

Ответы [ 28 ]

223 голосов
/ 22 апреля 2011

Только для Visual Studio / Express 2010. См. Другие (более простые) ответы для VS2012, VS2013 и т. Д.

Чтобы найти отсутствующих файлов , используйте информацию из статьи Включите ведение журнала системы проекта C ++ , чтобы включить ведение журнала отладки в Visual Studio и позвольте просто сообщить что вызывает перестройку:

  1. Откройте файл devenv.exe.config (находится в %ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\ или в %ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\). Для версий Express файл конфигурации называется V*Express.exe.config.
  2. Добавьте после строки </configSections> следующее:

    <system.diagnostics>
      <switches>
        <add name="CPS" value="4" />
      </switches>
    </system.diagnostics>
    
  3. Перезапустите Visual Studio
  4. Откройте DbgView и убедитесь, что он захватывает выходные данные отладки
  5. Попробуйте отладить (нажмите F5 в Visual Studio)
  6. Поиск в журнале отладки любых строк вида:

    devenv.exe Информация: 0: Проект «Bla \ Bla \ Dummy.vcxproj» не обновлен, поскольку отсутствует вход для сборки «Bla \ Bla \ SomeFile.h».

    (Я просто нажал Ctrl + F и искал not up to date). Это будут ссылки, из-за которых проект постоянно «устаревает».

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

Примечание: если используется 2012 или более поздняя версия, фрагмент должен быть:

<system.diagnostics>
  <switches>
   <add name="CPS" value="Verbose" />
  </switches>
</system.diagnostics>
165 голосов
/ 08 февраля 2013

В Visual Studio 2012 мне удалось добиться того же результата проще, чем в принятом решении.

Я изменил параметр в меню Инструменты Параметры Проекты и решения Построение и запуск → * Вывод сборки проекта MSBuild многословие "от Минимальное до Диагностическое .

Затем в выводе сборки я нашел те же строки, выполнив поиск "не в курсе":

Проект «Блабла» не обновлен. Элемент проекта 'c: \ foo \ bar.xml' имеет атрибут «Копировать в выходной каталог», установленный на «Копировать всегда».

59 голосов
/ 18 мая 2010

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

Удаление файла из проекта решило проблему.

15 голосов
/ 02 ноября 2010

Мы также столкнулись с этой проблемой и выяснили, как ее решить.

Проблема была, как указано выше "Файл больше не существует на диске."

Это не совсем правильно. Файл существует на диске, но файл .VCPROJ ссылается на файл где-то еще.

Вы можете «обнаружить» это, перейдя к «представлению включаемого файла» и щелкая по каждому включаемому файлу по очереди, пока не найдете тот, который Visual Studio не может найти. Затем вы ДОБАВЛЯЕТЕ этот файл (как существующий элемент) и удаляете ссылку, которую не можете найти, и все в порядке.

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

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

12 голосов
/ 03 октября 2012

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

Я потерял терпение и написал быстрый и грязный скрипт на Python, чтобы проверить файлы проекта (Visual Studio 2010) для меня и вывести все отсутствующие файлы одновременно, вместе с фильтрами, в которых они находятся. Вы можете найти это как Gist здесь: https://gist.github.com/antiuniverse/3825678 (или это форк, который поддерживает относительные пути )

Пример:

D:\...> check_inc.py sdk/src/game/client/swarm_sdk_client.vcxproj
[Header Files]:
  fx_cs_blood.h   (cstrike\fx_cs_blood.h)
  hud_radar.h   (cstrike\hud_radar.h)
[Game Shared Header Files]:
  basecsgrenade_projectile.h   (..\shared\cstrike\basecsgrenade_projectile.h)
  fx_cs_shared.h   (..\shared\cstrike\fx_cs_shared.h)
  weapon_flashbang.h   (..\shared\cstrike\weapon_flashbang.h)
  weapon_hegrenade.h   (..\shared\cstrike\weapon_hegrenade.h)
  weapon_ifmsteadycam.h   (..\shared\weapon_ifmsteadycam.h)
[Source Files\Swarm\GameUI - Embedded\Base GameUI\Headers]:
  basepaenl.h   (swarm\gameui\basepaenl.h)
  ...

Исходный код:

#!/c/Python32/python.exe
import sys
import os
import os.path
import xml.etree.ElementTree as ET

ns = '{http://schemas.microsoft.com/developer/msbuild/2003}'

#Works with relative path also
projectFileName = sys.argv[1]

if not os.path.isabs(projectFileName):
   projectFileName = os.path.join(os.getcwd(), projectFileName)

filterTree = ET.parse(projectFileName+".filters")
filterRoot = filterTree.getroot()
filterDict = dict()
missingDict = dict()

for inc in filterRoot.iter(ns+'ClInclude'):
    incFileRel = inc.get('Include')
    incFilter = inc.find(ns+'Filter')
    if incFileRel != None and incFilter != None:
        filterDict[incFileRel] = incFilter.text
        if incFilter.text not in missingDict:
            missingDict[incFilter.text] = []

projTree = ET.parse(projectFileName)
projRoot = projTree.getroot()

for inc in projRoot.iter(ns+'ClInclude'):
    incFileRel = inc.get('Include')
    if incFileRel != None:
        incFile = os.path.abspath(os.path.join(os.path.dirname(projectFileName), incFileRel))
        if not os.path.exists(incFile):
            missingDict[filterDict[incFileRel]].append(incFileRel)

for (missingGroup, missingList) in missingDict.items():
    if len(missingList) > 0:
        print("["+missingGroup+"]:")
        for missing in missingList:
            print("  " + os.path.basename(missing) + "   (" + missing + ")")
7 голосов
/ 21 марта 2012

Я удалил cpp и некоторые заголовочные файлы из решения (и с диска), но проблема все еще была.

Дело в том, что каждый файл, который использует компилятор, помещается в файл * .tlog в вашем временном каталоге. Когда вы удаляете файл, этот файл * .tlog не обновляется. Это файл, используемый инкрементными сборками для проверки актуальности вашего проекта.

Либо отредактируйте этот файл .tlog вручную, либо очистите проект и перестройте.

6 голосов
/ 02 марта 2012

У меня была похожая проблема, но в моем случае не было пропущенных файлов, произошла ошибка в том, как был определен выходной файл pdb: я забыл суффикс .pdb (я выяснил с помощью трюка отладки).

Для решения проблемы я изменил в файле vxproj следующую строку:

<ProgramDataBaseFileName>MyName</ProgramDataBaseFileName>

до

<ProgramDataBaseFileName>MyName.pdb</ProgramDataBaseFileName>
6 голосов
/ 18 сентября 2015

У меня была эта проблема в VS2013 (обновление 5), и для этого могут быть две причины, обе из которых вы можете найти, включив «Подробные» результаты сборки в «Инструменты» -> «Проекты и решения» -> «Сборка». и беги ".

  1. "Forcing recompile of all source files due to missing PDB "..."
    Это происходит, когда вы отключаете вывод отладочной информации в опциях вашего компилятора (в разделе «Настройки проекта»: «C / C ++» -> «Формат отладочной информации» - «Нет» и «Linker» -> «Создать информацию отладки» - «Нет»:) , Если вы оставили по умолчанию «C / C ++» -> «Имя файла базы данных программы» (то есть «$ (IntDir) vc $ (PlatformToolsetVersion) .pdb»), VS не найдет файл из-за ошибки (https://connect.microsoft.com/VisualStudio/feedback/details/833494/project-with-debug-information-disabled-always-rebuilds).
    Чтобы исправить это, просто очистите имя файла до "" (пустое поле).

  2. "Forcing rebuild of all source files due to a change in the command line since the last build."
    Кажется, это тоже известная ошибка VS (https://connect.microsoft.com/VisualStudio/feedback/details/833943/forcing-rebuild-of-all-source-files-due-to-a-change-in-the-command-line-since-the-last-build) и, похоже, она исправлена ​​в более новых версиях (но не VS2013). Я не знаю обходного пути, но если вы сделаете это, во что бы то ни стало, опубликуйте ее здесь.

4 голосов
/ 22 мая 2013

Другое простое решение, на которое ссылается Форум Visual Studio .

Изменение конфигурации: меню Инструменты Параметры Проекты и решения Настройки проекта VC ++ Режим обозревателя решений до Показать все файлы .

Затем вы можете увидеть все файлы в Solution Explorer.

Найдите файлы, помеченные желтым значком, и удалите их из проекта.

Все нормально.

4 голосов
/ 22 октября 2014

Я не знаю, есть ли у кого-то еще такая же проблема, но в свойствах моего проекта "Configuration Properties" -> C/C++ -> "Debug Information Format" было установлено значение «Нет», и когда я переключил его обратно на «Программную базу данных (/ Zi)» по умолчанию, это остановило проект каждый раз перекомпилируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...