Linux智能感知的准确性和性能改进

这篇博客文章是由C++软件Platform Team上的一个主要软件工程师Paul Maybee编写的。

null

准确的C++智能感知需要访问C++源文件引用的C++头文件。对于Linux场景,Linux MSBuild或CMake项目引用的头由visualstudio从作为生成目标的Linux设备(或VM、Docker容器或WSL系统)复制到Windows。VisualStudio然后使用这些头来提供IntelliSense。如果标头不是正确的版本,例如它们是GCC标题而不是CLAN标题,或者C++ 11头而不是C++ 17头,那么智能感知可能不正确,这可能会给用户带来混乱。另外,对于某些场景,头的数量可能非常大,因此复制可能需要很长时间。 Visual Studio 2019版本16.5预览版1 提高了头拷贝的准确性和性能,为Linux项目提供了更好的IntelliSense。

远程连接

使用Visual Studio建立新的远程连接时 连接管理器 旧的默认行为是在添加连接后立即将头从远程Linux目标复制到本地Windows缓存位置。这不再是做或必要的。现在,在打开Linux项目或为Linux目标配置CMake时,可以根据需要复制头。副本现在出现在后台。

The Connection Manager for remote Linux projects in Visual Studio.

连接管理器的“远程标头”对话框也已更改。可以显式启用或禁用每个连接的缓存。新连接的默认设置是启用。用户还可以选择一个连接并:

  • 按更新按钮按需下载连接的标头。
  • 按Delete按钮删除连接的标头缓存。
  • 按“浏览”按钮可在文件浏览器中打开连接的缓存位置。

Linux项目属性

有三个新的Linux项目属性可以帮助用户控制头复制:远程复制包含目录、远程复制排除目录和IntelliSense使用编译器默认值。

New configuration properties for a C++ Linux project including Remote Copy Include Directories, Remote Copy Exclude Directories, and IntelliSense Use Compiler Defaults

  • 远程复制包含目录 :要从Linux目标复制(递归)的目录列表。此属性影响IntelliSense的远程头副本,但不影响生成。当“IntelliSense使用编译器默认值”设置为false时,可以使用它。使用 其他包含目录 在C/C++一般tab下,指定用于智能感知和构建的附加目录。
  • 远程复制排除目录 :不复制的目录列表。通常用于删除include目录的子目录。例如,假设 /usr/包括 是要复制的。副本还将包含 /usr/包含/增强 如果它存在的话。但是,如果当前项目没有引用boost,那么复制它是浪费时间和空间的。添加 /usr/包含/增强 排除列表避免了不必要的拷贝。
  • IntelliSense使用编译器默认值 :一个布尔值,指示是否应查询此项目引用的编译器(见下文)的默认包含位置列表。这些将自动添加到要复制的远程目录列表中。仅当编译器不支持时,此属性才应设置为false 合同通用条款 -比如参数。gcc和clang编译器集都支持查询include目录(例如“g++-xc++-e-v-std=c++11”)。

其他C++项目属性也会影响头复制:

  • C/C++通用选项卡:附加目录包括目录、C编译器和C++编译器。
  • C/C++语言选项卡:C语言标准和C++语言标准

Additional C++ properties for Linux projects that affect header copying under the C/C++ General Tab

在中找到的路径 其他包含目录 列表用于IntelliSense和build。中的(非项目)路径 其他包含目录 列表将自动添加到要复制的目录列表中。  编译器通常通过选择 工作集 在“常规”选项卡中。然而,在某些情况下,编译器的更精确的规范是必要的,例如当“clang”绑定到Linux目标上的clangversion6时,指定“clang8”。将查询此处配置的编译器的默认包含目录列表。这个 C语言标准 C++  语言标准 当编译器被查询时,selected作为参数传递给编译器(例如-std=c++11)。在过去,c和clang的所有头都被复制到本地缓存中。通过使用在项目属性中选择的编译器和标准,visualstudio可以准确地识别项目所需的那些头,从而避免复制不必要的头。

Properties for the C/C++ Language Standard in Property Pages for C++ Linux Projects

CMake项目属性

CMake项目具有类似的设置,可以在“高级设置”部分下控制头的复制 CMake设置编辑器 :

图片[5]-Linux智能感知的准确性和性能改进-yiteyi-C++库

远程include目录列表中的路径可以用环境变量和“~”格式化,例如:“/usr/include/clang8$家庭/包括~/我的“包括”。对于CMake项目,将从CMake缓存中检索编译器名称和语言标准。MAKEu Cu COMPILER(和CMAKEu CXXu COMPILER)的值用于标识要查询的编译器。Cu STANDARD(CXXu STANDARD)属性用于标识有效的标准。

复制标题

每次打开项目或修改上述项目属性时,都会计算要复制的目录集。

在远程目标独立更新的情况下,例如安装了新版本的gcc,那么visualstudio的缓存相对于该目标将过期。VisualStudio不会检测到远程标头已更改。在这种情况下,用户必须通过选择 项目> 扫描解决方案 从visualstudio主菜单,这将导致目录与远程目标同步,即使它们以前被复制过。

给我们你的反馈

您对我们的Linux工具或visualstudio中的CMake支持有反馈吗?我们很乐意收到您的来信,帮助我们确定优先级并为您构建合适的功能。我们可以通过以下评论联系到您, 开发者社区 ,电子邮件( visualcpp@microsoft.com ),和Twitter( @视觉 ). 建议新特性或文件错误的最好方法是通过开发者社区。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享