VS2019: 提升Linux IntelliSense的准确性和性能

VS2019: 提升Linux IntelliSense的准确性和性能

作者:HQ |  时间:2020-01-13 |  浏览:47 |  评论已关闭 条评论

一点小改进
这篇文章来自C++跨平台组的Principal软件工程师Paul Maybee。

要实现C++ IntelliSense的准确性,必须要能访问到C++的头文件,而这些头文件又被C++的源文件所引用(包含)。对于Linux下的场景,被一个Linux MSBuild工程或者一个CMake工程所引用到的头文件将会被Visual Studio从一台Linux设备(可以是VM,Docker容器或者WSL系统)拷贝到Windows目录下。然后Visual Studio将会使用这些头文件来提供IntelliSense功能。如果头文件不是正确的版本,例如它们是gcc的头文件,而不是clang的,或者它们是C++ 11的头文件而不是C++ 17的,那么IntelliSense将不会准确地工作,同时会给用户带来很大的困扰。
在某些情况下,头文件的数量会很大,在系统间拷贝它们将会花费很长的时间。VS2019 v16.5 Preview 1提升了头文件拷贝的性能,对于Linux项目来说,它们得到了一个更好的IntelliSense。

远程连接
当使用VS的Connection Manager创建一个远程连接时,默认情况下会从远程Linux目标机器上拷贝头文件到本地Windows系统上的缓存位置。这个默认行为可能不是那么必要。在新版本中,头文件将会按需进行拷贝,只有当打开一个Linux工程或者配置CMake时才会进行。拷贝的工作将会在后台进行。

连接管理器的远程头文件对话框界面也得到了更新。对每一个连接的缓存可以被启用或者被禁用。默认情况下,连接的缓存将会被启用。用户可以选择一个连接并进行如下的操作:
> 点击Update按钮,可以按需的进行头文件下载
> 点击Delete按钮,可以从连接中删除缓存的头文件
> 点击Explore按钮,可以打开缓存的位置

Linux工程属性
为了帮助用户来控制头文件的拷贝,我们添加了三个Linux工程属性,它们分别是:
> Remote Copy Include Directories
> Remote Copy Exclude Directories
> IntelliSense Uses Compiler Defaults

Remote Copy Include Directories
用于配置远程Linux目标机器的拷贝源位置。这个属性仅会影响IntelliSense的头文件拷贝过程,而不会影响工程编译。它通常用在[IntelliSense Uses Compiler Defaults]被设置为false的情况。使用C++通用属性下的[Additional Include Directories]来指定用于编译和IntelliSense的头文件包含目录。

Remote Copy Exclude Directories
用来配置远程Linux目标机器上不需要被拷贝的目录。通常这个属性用于从一个包含目录中过滤掉子目录。例如,假设你需要拷贝/usr/include,这个目录中含有/usr/include/boost目录。如果你的工程不需要boost,则拷贝这个子目录会浪费时间和磁盘空间。可以使用此属性将boost子目录添加到排除列表来避免非必要的拷贝。

IntelliSense Uses Compiler Defaults
这个是一个布尔标志,用来指示编译器是否需要查询默认头文件的位置。这些默认位置将会自动进行拷贝。这个标志仅在编译器不支持gcc-link样式的参数时设置为false。gcc和clang编译器都支持查询包含目录(例如:”g++ -x c++ -E -v -std=c++11″)。

其他会影响到头文件拷贝的C++工程属性
> C/C++ General tab: C/C++编译器的额外的包含目录
> C/C++ Language tab: C语言和C++语言标准

在[Additional Include Directories]中配置的路径会被IntelliSense和编译用到。这些路径将会自动被添加到待拷贝目录列表中。编译器通常会通过Platfrom Toolset的选项来自动进行填充。但是在某些情况下,提供一个更加精确的位置对于编译器来说是必要的。例如,当clang绑定到clang v6时,可以显式的选择”clang 8″。编译器将会被查询其默认的包含目录列表。
[C Language Standard]和[C++ Language Standard]选项用于向编译器提供一个参数来确定需要被查询的默认目录。旧版本的VS会拷贝为C和Clang拷贝所有头文件到本地缓存。通过使用编译器标准选项,VS可以明确的判定哪些文件是需要拷贝的,避免了非必要的文件拷贝。

CMake工程属性
CMake工程也有类似的选项来控制头文件拷贝,它们位于CMake配置编辑器下面的[Advanced Settings]章节,如下图所示:

在远程包含目录列表中的路径可以连同环境变量一起被格式化为”~”,例如”/usr/include/clang8;$HOME/include;~/myinclude”。
对于CMake工程来说,编译器名称和语言标准是从CMake工程缓存中获取得到。
以下两个变量值用来确定被查询的编译器版本:
MAKE_C_COMPILER
CMAKE_CXX_COMPILER
而C_STANDARD (CXX_STANDARD)则被用来确定语言版本。

头文件拷贝
每当一个工程被打开或者上面提到的工程属性被修改时,待拷贝的文件集合将被计算一次。

如果远程机器被独立的更新,例如一个新版本gccgcc安装了,则VS的缓存将会过期。VS将不会检测远程机器上的头文件是否变化。在这种情况下,用户必须手动点击[Project > Scan Solution]来发起一次主动扫描。然后目标主机上的头文件目录将会得到自动同步,即使是它们还没有被拷贝到本机上。

总结
自从用上了C++ IntelliSense,写代码就更加顺手了,你还记得大明湖畔那个Whole Tomato Software吗?

标签:

评论已关闭。