Visual Studio 2017 RC CMake 支持功能试用

2016-11-22

微软不久前发布了 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 目录大概长这样:

可以看到,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


标签: C/C++Windows

留言请用 Github Issues

聊天请在 Gitter/fan-farm

授权协议 (CC) BY-NC-SA | 订阅 RSS | 邮箱 fzheng@link.cuhk.edu.hk