[visual-studio] Visual Studio 2010은 항상 프로젝트가 오래되었다고 생각하지만 아무것도 변경되지 않았습니다.

여기에 설명 된 것과 비슷한 문제가 있습니다 .

또한 Visual Studio 2008에서 Visual Studio 2010으로 C ++ / CLI 및 C # 프로젝트의 혼합 솔루션을 업그레이드했습니다. 이제 Visual Studio 2010에서는 하나의 C ++ / CLI 프로젝트가 항상 오래되었습니다.

이전에 컴파일 및 링크되어 F5히트가 발생해도 “프로젝트가 오래되었습니다. 빌드 하시겠습니까?” 가 나타납니다. DLL 파일은 계층이 매우 낮고 솔루션의 거의 모든 프로젝트를 다시 빌드해야하기 때문에 매우 성가신 일입니다.

내 pdb 설정이 기본값으로 설정되어 있습니다 ( 이 문제의 해결 방법 ).

Visual Studio 2010에서 강제로 다시 빌드하거나 프로젝트가 최신이라고 생각하는 이유가 있습니까?

Visual Studio 2010이 왜 그렇게 동작하는지 다른 아이디어가 있습니까?



답변

Visual Studio / Express 2010에만 해당합니다. VS2012, VS2013 등에 대한 다른 (쉬운) 답변보기

누락 된 파일 을 찾으려면 C ++ 프로젝트 시스템 로깅 사용 기사의 정보 를 사용하여 Visual Studio에서 디버그 로깅을 사용하도록 설정 하고 재 빌드의 원인을 알려주십시오 .

  1. 또는에서 devenv.exe.config찾은 파일을 엽니 다 . Express 버전의 경우 구성 파일의 이름은 입니다.%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\Common7\IDE\V*Express.exe.config
  2. </configSections>줄 뒤에 다음을 추가하십시오 .

    <system.diagnostics>
      <switches>
        <add name="CPS" value="4" />
      </switches>
    </system.diagnostics>
    
  3. Visual Studio를 다시 시작하십시오.
  4. DbgView를 열고 디버그 출력을 캡처하고 있는지 확인하십시오.
  5. 디버깅을 시도하십시오 (Visual Studio에서 F5를 누르십시오)
  6. 디버그 로그에서 다음 형식의 행을 검색하십시오.

    devenv.exe 정보 : 0 : 빌드 입력 ‘Bla \ Bla \ SomeFile.h’가 없기 때문에 ‘Bla \ Bla \ Dummy.vcxproj’프로젝트가 최신 상태가 아닙니다.

    (방금 Ctrl + F를 치고 검색했습니다. not up to date) 이것들은 프로젝트가 영구적으로 “오래된”원인이 된 참조 일 것입니다.

이 문제를 해결하려면 프로젝트에서 누락 된 파일에 대한 참조를 제거하거나 참조를 업데이트하여 실제 위치를 표시하십시오.

참고 : 2012 이상을 사용하는 경우 스 니펫은 다음과 같아야합니다.

<system.diagnostics>
  <switches>
   <add name="CPS" value="Verbose" />
  </switches>
</system.diagnostics>


답변

Visual Studio 2012에서는 수용 된 솔루션보다 동일한 결과를 쉽게 얻을 수있었습니다.

도구옵션프로젝트 및 솔루션빌드 및 실행 → * MSBuild 프로젝트 빌드 출력 세부 정보 ” 메뉴의 옵션 을 최소 에서 진단으로 변경했습니다 .

그런 다음 빌드 출력에서 ​​”최신 상태가 아님”을 검색하여 동일한 줄을 찾았습니다.

‘blabla’프로젝트가 최신이 아닙니다. 프로젝트 항목 ‘c : \ foo \ bar.xml’에 ‘Copy to Output Directory’속성이 ‘Copy always’로 설정되어 있습니다.


답변

이것은 오늘 나에게 일어났다. 원인을 추적 할 수있었습니다. 프로젝트에 더 이상 디스크에 존재하지 않는 헤더 파일이 포함되어 있습니다.

프로젝트에서 파일을 제거하면 문제가 해결되었습니다.


답변

또한이 문제가 발생하여 해결 방법을 찾았습니다.

문제는 위에서 언급 한대로 “파일이 더 이상 디스크에 없습니다.”

이것은 정확하지 않습니다. 파일이 디스크에 존재하지만 .VCPROJ 파일이 다른 곳에서 파일을 참조하고 있습니다.

“파일 포함보기”로 이동하여 Visual Studio에서 찾을 수없는 파일을 찾을 때까지 각 포함 파일을 차례로 클릭하여이를 ‘발견’할 수 있습니다. 그런 다음 해당 파일을 기존 항목으로 추가하고 찾을 수없는 참조를 삭제하면 모든 것이 정상입니다.

올바른 질문은 다음과 같습니다. 포함 파일의 위치를 ​​모르는 경우 Visual Studio는 어떻게 빌드 할 수 있습니까?

우리는 .vcproj 파일이 Visual Studio GUI에 표시되지 않는 어딘가에 해당하는 파일에 대한 상대 경로를 가지고 있다고 생각하며, 이것이 포함의 트리 뷰가 올바르지 않더라도 프로젝트가 실제로 빌드되는 이유를 설명합니다.


답변

받아 들인 대답은 내가 작업을 시작해야했던 혼란스러운 프로젝트 에서이 문제를 해결하는 방법을 알아내는 올바른 길을 안내하는 데 도움이되었습니다. 그러나 매우 많은 수의 잘못된 포함 헤더를 처리해야했습니다. 자세한 디버그 출력을 사용하면 하나를 제거하면 IDE가 30 초 동안 정지되어 디버그 스퓨가 출력되므로 프로세스 속도가 매우 느려집니다.

나는 참을성이 없어서 (Visual Studio 2010) 프로젝트 파일을 확인하고 누락 된 모든 파일을 필터와 함께 한 번에 출력하는 빠르고 더러운 Python 스크립트를 작성했습니다. 여기 요점 : 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 + ")")


답변

솔루션 (및 디스크)에서 cpp 및 일부 헤더 파일을 삭제했지만 여전히 문제가 있습니다.

컴파일러가 사용하는 모든 파일은 temp 디렉토리의 * .tlog 파일에 들어갑니다. 파일을 제거해도이 * .tlog 파일은 업데이트되지 않습니다. 증분 빌드에서 프로젝트가 최신인지 확인하는 데 사용되는 파일입니다.

이 .tlog 파일을 수동으로 편집하거나 프로젝트를 정리하고 다시 빌드하십시오.


답변

비슷한 문제가 있었지만 필자의 경우 누락 된 파일이 없었고 pdb 출력 파일을 정의하는 방법에 오류가있었습니다. 접미사 .pdb를 잊어 버렸습니다 (디버그 로깅 트릭으로 찾았습니다).

vxproj 파일에서 다음 문제를 해결하기 위해 다음 줄을 변경했습니다.

<ProgramDataBaseFileName>MyName</ProgramDataBaseFileName>

<ProgramDataBaseFileName>MyName.pdb</ProgramDataBaseFileName>