Visual Studio 2017 RC CMake 支持功能试用

Nov 22, 2016

微软不久前发布了 Visual Studio 2017 RC 版本,有不少亮点,其中之一是内置 CMake 支持。这意味着以后在 Windows 下编译 cmake 项目不需要用命令行或者 cmake GUI 手动跑一遍 cmake 再进行编译了。

安装

下载 Visual Studio 官网的 VS 2017 RC 版安装程序。这一版的安装界面比以前更友好也更可自定义些,不会再强制安装 VB C# Web 之类的东西。我们要测试 cmake 支持功能,所以选择基本的 C++ 支持和 cmake 支持选项就够了。

自定义选项之后等待安装完成即可。

cmake 支持功能初探

打开 cmake 项目非常简单,file->open->foler..,选择 cmake 项目文件夹打开即可。VS 2017 会自动识别该文件夹下面的 CMakeLists.txt 文件,并在你打开的时候完成项目解析(即完成命令行下的 cmake 这一步)。这一步和 Linux 下用 QtCreator 直接打开一个 CMakeLists 很相似。这里我尝试打开使用 cmake 编译的可视化库 Pangolin,没有问题。解析完成后的项目树是这样的:

我们知道,Linux 命令行下用 cmake 编译一个库通常步骤是:

cmake 
make 
sudo make install

第一步根据 CMakeLists.txt 解析项目并生成本地编译文件(在 Linux 下为 Makefile,在 Windows 下为 VS solution)。第二步编译项目,生成库文件和可执行文件。第三个为可选项,将编译完成的库文件、可执行文件以及头文件安装到系统特定的安装目录(Ubuntu 下通常默认上为 /usr/local/)。在 VS 2017 里,第一步是打开项目、更改项目配置时自动完成的,而且没有手动执行的选项。其他操作则通过 CMakeLists.txt 上的右键菜单完成:

其他的调试功能都和 VS 原生项目没什么区别,非常方便。

自定义选项

可用通过 Project->Edit Settings 来自定义 cmake 选项。自定义选项是通过编辑和 CMakeLists.txt 在同一目录下的 CMakeSettings.json 文件来实现的,默认的配置长这样

{
    "configurations": [
      {
        "name": "Visual Studio 15 x86",
        "generator": "Visual Studio 15 2017",
        "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
        "cmakeCommandArgs": "",
        "buildCommandArgs": "-m -v:minimal"
      },
      {
        "name": "Visual Studio 15 x64",
        "generator": "Visual Studio 15 2017 Win64",
        "buildRoot":  "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
        "cmakeCommandArgs": "",
        "buildCommandArgs": "-m -v:minimal"
      }
    ]
}

可以看到,能够自定义的选项包括编译器版本(默认 VC15,可改为 VC14)、build 目录、cmake 命令参数、build 命令参数。注意一下 build 目录,默认设置比较蛋疼,首先 ${env.LOCALAPPDATA} 是一个隐藏目录,即用户目录下的 AppData 文件夹;其次 ${workspaceHash} 实际上是一串无意义的 Hash 码。所以如果用户想使用编译完成的文件,需要到这个又深又难进去的文件夹里翻找。所以这里建议把 build 目录修改为自己能够方便找到的位置。配置文件中可以用 ${workspaceRoot} 代表项目目录,所以我们可以把 build 目录修改为与项目目录平行的位置:

"buildRoot": "${workspaceRoot}\\..\\Pangolin-CMakeBuild\\${name}",

这样就比较好找了。比如我编译 Pangolin 的 build 目录大概长这样:

lXOdqP.png

可以看到,VS 2017 的 cmake 生成的就是 VS 原生的 solution 文件。

Bug

目前 VS 2017 还是 RC 版,仍不够稳定。cmake 功能除了时不时的迷之小错误之外,在我的机器上还碰上一个比较很严重的 bug。在设置 build 目录的时候,我一开始尝试将 build 目录放在项目文件夹之内——我们在 Linux 下用 cmake 的时候经常这么搞,在项目文件夹下新建 build 目录然后在该目录里执行 cmake,方便项目管理。比如配置 build 目录为:

"buildRoot": "${workspaceRoot}\\CMakeBuild\\${name}",

这个时候 VS 的 cmake 功能就挂了。具体表现为,当你保存 json 文件时,VS 不会自动执行 cmake。当你重启 VS 再打开该项目时,VS 会执行 cmake,但是在 cmake 输出提示都已经结束很长时间之后,IntelliSense 还是不工作,同时如果想右击 CMakeLists.txt 来编译的话,菜单会一直提示 cmake 仍处于 cache generation 的 busy 阶段,无法进行下一步操作。等很久都一样。而这个问题,只要你不把 buildRoot 放在 workspaceRoot 下面就不会出现。

已经向开发者社区汇报了这个 bug:Developer Community

License (CC) BY-NC-SA | Subscribe RSS | Email sansui_z@126.com