Visual studio 不断重建和智能感知中断

Visual studio constantly rebuilding and intellisense broken

问题

1) Visual studio 不断重建每个项目,而不管对源代码所做的更改。 2)智能感知也坏了。每个命令错误 "No additional information available" 3) Visual studio 说有一个错误 E1696 无法打开源文件 "CURRENTLYOPENSOURCEFILEINCAPS.CPP" 尽管构建项目成功了。错误图标不同于导致构建失败的错误。

我做了什么

我已启用诊断输出。对于零检查 cmake 目标,它找不到我检查过的 generate.stamp.rule 在构建之前确实存在并且没有被删除和重新生成并且文件路径是正确的。个别项目都有类似的文件,但 visual studio 说它们丢失了。

我浏览了许多堆栈溢出帖子以使智能感知再次运行,但没有任何效果。使用解决方案资源管理器打开的所有文件在导航栏中都有“(全局范围)”,那里曾经有一个文件路径。

我使用 msbuild 构建,它说 "Creating "x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild" 因为指定了 "AlwaysCreate"。"我不知道为什么要指定 AlwaysCreate。我读过,如果 #include 试图包含不存在的东西但我不明白它是如何编译的,就会发生这种情况 - 无论如何,这是一个很大的代码库,如果这是肯定检查的原因以前提交的这不是问题的地方应该修复它 - 但没有。

我有一个源代码外构建,所以我尝试删除它并重新制作所有内容,以便清除所有缓存变量。

我已尝试将所有设置重置为出厂设置。

我已禁用并发构建。

我已经 运行 处于管理员模式。

我已经删除了我的存储库中的所有内容并构建了输出,并在发生这种情况之前重新克隆并检查了过去的提交。

我试过将源代码复制到另一个驱动器和驱动器上不同级别的文件夹深度。

我已经尝试卸载并重新安装 visual studio 两次。

可以确认创建新的虚拟项目没有列出的 3 个问题中的任何一个。

我尝试了删除所有内容、重置 vs、重新安装 vs、克隆以前工作的提交、cmaking、在管理员中构建 vs、构建 vs 在管理员中,它仍然有所有 3 个问题。

诊断输出中的第一个故障点

1>------ Up-To-Date check: Project: ZERO_CHECK.vcxproj, Configuration: Debug x64 ------
1>Project is not up-to-date: build input 'e:\blabla\blabuilddir\cmakefilesf04b81c84059a8a3158e97cbfec9b8\generate.stamp.rule' is missing.

不是。

在 deciding/doing AlwaysCreate 之前的更多输出

>Done building target "_HandlePackageFileConflicts" in project "ALL_BUILD.vcxproj".
16>Target "ResolveAssemblyReferences" in file "C:\Program Files (x86)\Microsoft Visual Studio17\Professional\MSBuild.0\Bin\Microsoft.Common.CurrentVersion.targets":
16>  Added Item(s): 
16>      _ReferenceInstalledAssemblyDirectory=
16>          C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0
16>          C:\Program Files (x86)\Windows Kits\References
16>  Set Property: ResolveAssemblyReferencesStateFile=x64\Debug\ALL_BUILD\ALL_BUILD.vcxprojAssemblyReference.cache
16>  Set Property: ResolveAssemblyReferencesSilent=false
16>  Set Property: ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch=Warning
16>  Set Property: FindDependenciesOfExternallyResolvedReferences=false
16>  Task "ResolveAssemblyReference" skipped, due to false condition; ('@(Reference)'!='' or '@(_ResolvedProjectReferencePaths)'!='' or '@(_ExplicitReference)' != '') was evaluated as (''!='' or ''!='' or '' != '').
16>Done building target "ResolveAssemblyReferences" in project "ALL_BUILD.vcxproj".
16>Target "GenerateBindingRedirects" skipped, due to false condition; ('$(AutoGenerateBindingRedirects)' == 'true' and '$(GenerateBindingRedirectsOutputType)' == 'true') was evaluated as ('' == 'true' and 'true' == 'true').
16>Target "_RemoveZipFileSuggestedRedirect" skipped, due to false condition; ('$(_TargetFrameworkVersionWithoutV)' >= '4.7.1' And '$(AllowZipFileRedirect)' != 'true') was evaluated as ('4.0' >= '4.7.1' And '' != 'true').
16>Target "GenerateBindingRedirectsUpdateAppConfig" skipped, due to false condition; ('$(AutoGenerateBindingRedirects)' == 'true' and '$(GenerateBindingRedirectsOutputType)' == 'true' and Exists('$(_GenerateBindingRedirectsIntermediateAppConfig)')) was evaluated as ('' == 'true' and 'true' == 'true' and Exists('x64\Debug\ALL_BUILD\ALL_BUILD.config')).
16>Target "ResolveComReferences" skipped, due to false condition; ('@(COMReference)'!='' or '@(COMFileReference)'!='') was evaluated as (''!='' or ''!='').
16>Target "AfterResolveReferences" in file "C:\Program Files (x86)\Microsoft Visual Studio17\Professional\MSBuild.0\Bin\Microsoft.Common.CurrentVersion.targets":
16>Done building target "AfterResolveReferences" in project "ALL_BUILD.vcxproj".
16>Target "ImplicitlyExpandDesignTimeFacades" skipped, due to false condition; ('$(ImplicitlyExpandDesignTimeFacades)' == 'true') was evaluated as ('' == 'true').
16>Target "ResolveTestReferences" skipped, due to false condition; ('@(Shadow)'!='') was evaluated as (''!='').
16>Target "ResolveReferences" in file "C:\Program Files (x86)\Microsoft Visual Studio17\Professional\MSBuild.0\Bin\Microsoft.Common.CurrentVersion.targets":
16>Done building target "ResolveReferences" in project "ALL_BUILD.vcxproj".
16>Target "PrepareForBuild" skipped. Previously built successfully.
16>Target "PrepareForBuild" skipped. Previously built successfully.
16>Target "InitializeBuildStatus" in file "C:\Program Files (x86)\Microsoft Visual Studio17\Professional\Common7\IDE\VC\VCTargets\Microsoft.CppBuild.targets":
16>  Task "ReadLinesFromFile"
16>    Task Parameter:File=x64\Debug\ALL_BUILD\ALL_BUILD.tlog\ALL_BUILD.lastbuildstate
16>    Output Item(s): 
16>        _ReadProjectStateLine=
16>            #TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.17763.0
16>            Debug|x64|E:\blaWork\bla\blaBuild-win64-vc15\|
16>  Done executing task "ReadLinesFromFile".
16>  Set Property: ProjectStateLine=#TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.17763.0
16>  Set Property: StateBuildType=Build
16>  Task "WriteLinesToFile"
16>    Task Parameter:Overwrite=True
16>    Task Parameter:File=x64\Debug\ALL_BUILD\ALL_BUILD.tlog\ALL_BUILD.lastbuildstate
16>    Task Parameter:
16>        Lines=
16>            #TargetFrameworkVersion=v4.0:PlatformToolSet=v141:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native32Bit:WindowsTargetPlatformVersion=10.0.17763.0
16>            Debug|x64|E:\blaWork\bla\blabuild-win64-vc15\|
16>  Done executing task "WriteLinesToFile".
16>  Task "Touch"
16>    Task Parameter:AlwaysCreate=True
16>    Task Parameter:Files=x64\Debug\ALL_BUILD\ALL_BUILD.tlog\unsuccessfulbuild
16>    Touching "x64\Debug\ALL_BUILD\ALL_BUILD.tlog\unsuccessfulbuild".
16>  Done executing task "Touch".
16>Done building target "InitializeBuildStatus" in project "ALL_BUILD.vcxproj".

这个问题显然是由 windows 区分大小写的狡猾实现引起的。

背景 我在各种 linux/windows 平台上工作,所以当我读到 windows 区分大小写时,我很兴奋并在大约两周前试用了它。在 repo 文件夹上启用区分大小写后,cmake 无法再找到编译器,而且我没有时间弄清楚为什么,所以我将其切换回来。我使用的命令不是递归的,所以我一定没有禁用我启用的所有文件夹,所以仍然存在一些区分大小写的问题。

解决我问题的步骤:

  1. 运行 windows 管理员模式下的 powershell
  2. fsutil.exe file setCaseSensitiveInfo C:\folder disable
  3. 在从驱动器到最深源代码文件的每个目录级别上重复。

应该有一个递归标志或其他东西,但如果没有,在 powershell 中循环遍历文件夹非常容易,但我现在懒得让语法正确。

more info on windows case sensitivity here

补充 codeMetis 解决方案,而不是 运行 为项目的每个子目录手动执行命令,您可以 运行 PowerShell 中的以下命令:

(Get-ChildItem -Recurse -Directory).FullName | ForEach-Object {fsutil.exe file setCaseSensitiveInfo $_ disable}

这将递归地将 fsutil 命令应用于当前目录的所有子目录。