这篇博客文章是由C++软件Platform Team上的一个主要软件工程师Paul Maybee编写的。
准确的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时,可以根据需要复制头。副本现在出现在后台。
连接管理器的“远程标头”对话框也已更改。可以显式启用或禁用每个连接的缓存。新连接的默认设置是启用。用户还可以选择一个连接并:
- 按更新按钮按需下载连接的标头。
- 按Delete按钮删除连接的标头缓存。
- 按“浏览”按钮可在文件浏览器中打开连接的缓存位置。
Linux项目属性
有三个新的Linux项目属性可以帮助用户控制头复制:远程复制包含目录、远程复制排除目录和IntelliSense使用编译器默认值。
- 远程复制包含目录 :要从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++语言标准
在中找到的路径 其他包含目录 列表用于IntelliSense和build。中的(非项目)路径 其他包含目录 列表将自动添加到要复制的目录列表中。 编译器通常通过选择 工作集 在“常规”选项卡中。然而,在某些情况下,编译器的更精确的规范是必要的,例如当“clang”绑定到Linux目标上的clangversion6时,指定“clang8”。将查询此处配置的编译器的默认包含目录列表。这个 C语言标准 和 C++ 语言标准 当编译器被查询时,selected作为参数传递给编译器(例如-std=c++11)。在过去,c和clang的所有头都被复制到本地缓存中。通过使用在项目属性中选择的编译器和标准,visualstudio可以准确地识别项目所需的那些头,从而避免复制不必要的头。
CMake项目属性
CMake项目具有类似的设置,可以在“高级设置”部分下控制头的复制 CMake设置编辑器 :
远程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( @视觉 ). 建议新特性或文件错误的最好方法是通过开发者社区。