我在 Visual Studio 中遇到 IntelliSense 的问题,当使用在构建过程中生成 .cpp 和 .hpp 文件的自定义 NuGet 包时,它不会在重建后自动更新其数据库。
在我的 C++ 项目中,我使用带有自定义 .targets 文件的 NuGet 包。此 .targets 文件在构建过程中(通过任务)运行一个工具,该工具获取多个输入文件,对其进行处理,并生成两个文件: generated.cpp 和 generated.hpp。然后使用 ClInclude 和 ClCompile 将这些文件包含在项目中。
输入文件定义我的项目使用的类和成员,生成的标头包含在我的代码中。构建过程本身运行良好,IntelliSense 最初会按预期识别这些文件。
如果我更改其中一个输入文件中的某些内容(例如,向类添加新成员),重建项目,然后尝试在代码中使用新成员,则 IntelliSense 无法识别该更改。它显示新成员的错误,就好像标题尚未更新一样。
我发现解决此问题的唯一方法是:
手动打开生成的.cpp文件,右键单击,选择“重新扫描文件”。 重新扫描整个解决方案或手动删除 IntelliSense 数据库。 这些都不是实际的开发解决方案。
这是一个简化的设置示例:
输入文件 TestInput.file(在构建过程中用作工具的输入)
#pragma once
class Test
{
public:
const static int test1 = 1;
const static int test2 = 2;
const static int test3 = 9000;
};
生成的文件(由工具生成):
生成的.hpp
#pragma once
class Test
{
public:
const static int test1 = 1;
const static int test2 = 2;
const static int test3 = 9000;
};
虚拟生成器目标文件(从主项目引用的目标文件)
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Label="PropertySheets" />
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup />
<ItemGroup>
<InputFiles Include="$(MSBuildProjectDirectory)\*Input.File"/>
<UpToDateCheckInput Include="@(ProtoFiles)" />
</ItemGroup>
<Target Name="DummyGenerator" Inputs="@(InputFiles)" Outputs="%(InputFiles.rootdir)%(InputFiles.directory)%(InputFiles.filename).h" BeforeTargets="PrepareForBuild">
<Exec Command="copy %(InputFiles.Identity) @(InputFiles->'%(rootdir)%(directory)%(filename).h')" Condition="%(InputFiles.Identity) != ''" />
<ItemGroup>
<ClInclude Include="@(InputFiles->'%(rootdir)%(directory)%(filename).h')" Condition="%(InputFiles.Identity) != ''" />
</ItemGroup>
</Target>
</Project>
修改 TestInput.file(例如通过添加新的类成员)并重建(仅将 TestInput.file 复制到 TestInput.h)后,Intellisense 将无法识别测试类中的新成员,直到被告知手动重新扫描。
如何配置 Visual Studio 或修改我的设置,以便 IntelliSense 自动更新其数据库以反映重建后生成的 .hpp 文件中的更改?理想情况下,我希望 IntelliSense 重新扫描受影响的文件,而无需手动干预。
我尝试了多种方法来使 IntelliSense 在重建后自动识别生成文件的更新。我尝试过的一些事情包括:
我希望 IntelliSense 在构建后自动获取对 generated.hpp 和 generated.cpp 文件的更改,就像我在 IDE 中编辑的常规源文件一样。
将示例代码克隆到我本地的 VS2022(17.12.3) 后,不幸的是,我无法重现此问题。智能感知可以识别测试类中的新成员。请检查测试结果: (在
Animal
中添加新班级成员TestInput.file
)
我已经注意到这个文档为 IntelliSense 配置 C++ 项目说,
为了保持 IntelliSense 数据库与代码同步,Visual Studio 自动启动仅 IntelliSense 构建作为后台任务,以响应项目设置或源文件中所做的某些更改。 但是,在某些情况下,Visual Studio 可能无法及时更新 IntelliSense 数据库。
建议:
您可以通过右键单击解决方案资源管理器中的项目节点并选择重新扫描解决方案来强制重新扫描解决方案中的所有文件。
我猜这个功能并不适用于所有情况。我建议您可以在Visual Studio论坛提交功能请求。这样您可以直接与相应的产品组进行交互,也可以让产品组更方便地收集和分类您的建议。