在Visual C++中使用CMake进行Linux开发

[原文发表地址] Visual C++ for Linux Development with CMake

[原文发表时间] 2017/08/25

Visual Studio 2017 15.4中,你现在可以从CMake项目中定位Linux。这使你可以使用现有的代码库,使用CMake作为构建解决方案而无需将其转化为VS项目。如果你的代码库是跨平台的则可以从Visual Studio中定位Windows和Linux。

本文会对Visual Studio中的CMake支持Linux做一个概述。如果你刚开始接触CMake你可以查看这篇博客Visual Studio中CMake的概述

更新10/10/2017:在第15.4版的第一个版本中,我们有一个安装程序创建错误,当它与Linux工作负载一起安装时,会破坏CMake。 我们在这里记录了一个解决方法。 这将在下一次维修更新到15.4中得到修复。

开始

要启用这个功能,请确保在Visual Studio installer 页面上选上Linux development C++ Workload。当你选上这个Workload后,Visual C++ tools for CMake and Linux组件就会被默认选上。Visual Studio中的CMake支持需要在CMake 3.8中引入的服务器模式支持。如果你的包管理器提供的是较旧版本,请查阅从源代码构建CMake的说明。

开始使用此功能,在与cpp文件相同的文件夹中创建一个简单的CMakeLists.txt文件,如下所示。(通过File>Open>Folder…或者devenv.exe<foldername>打开文件夹)。

Hello.cpp

 #include <iostream>;

int main(int argc, char* argv[])
{
    std::cout << "Hello" << std::endl;
}

CMakeLists.txt

 project (hello-cmake)
add_executable(hello-cmake hello.cpp)

只要你一打开这个文件夹,VS将解析CMakeLists.txt。默认情况下,将使用x86-Debug的windows目标。为了针对Linux,可以改变项目设置为Linux- Debug或者Linux- Release。当你这样操作之后,你的资源将被复制到你的Linux机器上,在这里将运行CMake为你的项目生成CMake缓存。

默认情况下,将使用工具>选项>跨平台>连接管理器列表中的第一个远程系统。如果你没有创建任何的远程连接,当你首次在项目设置中选择Linux目标时,系统将提示你创建一个。

要在远程系统中调试代码,先设置一个断点,再选择CMake目标作为项目设置旁边的工具栏菜单中的启动项目,然后点击运行(或者按F5)。

配置Linux的CMake设置

要更改使用的默认值,请通过CMake>Change CMake Settings>CMakeLists.txt,或者右键点击CMakeSettings.txt然后选择Change CMake Settings。这样就会在你的文件夹中创建一个新的名为CMakeSettings.json的文件。文件的内容刚开始就是项目设置菜单项中列出的默认配置。下面的这个例子这个是基于上面例子中的Linux- Debug的配置。

 {
      "name": "Linux-Debug",
      "generator": "Unix Makefiles",
      "remoteMachineName": "${defaultRemoteMachineName}",
      "configurationType": "Debug",
      "remoteCMakeListsRoot": "/var/tmp/src/${workspaceHash}/${name}",
      "cmakeExecutable": "/usr/local/bin/cmake",
      "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuilds\\${workspaceHash}\\build\\${name}",
      "remoteBuildRoot": "/var/tmp/build/${workspaceHash}/build/${name}",
      "remoteCopySources": true,
      "remoteCopySourcesOutputVerbosity": "Normal",
      "remoteCopySourcesConcurrentCopies": "10",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "",
      "ctestCommandArgs": "",
      "inheritEnvironments": [ "linux-x64" ]
}

你可以选择第2行的名称来识别自定义配置。如果你已经定义了多个远程系统,你可以输入相应的名字代替第4行的默认值。智能感应已经从系统的此字段启用可以帮助你选择正确的系统。第6行的remoteCMakeListsRoot是你的项目将被复制到远程系统中的地址,默认是在/var/tmp下。第9行的remoteBuildRoot字段是在远程系统上生成输出的地址,该输出也将在本地复制到第8行由buildRoot指定的位置。

从源代码构建一个支持CMake的版本

在Linux机器上CMake需求的最小版本是3.8,并且还必须支持服务器模式。运行下列命令行进行验证

 cmake --version

运行下面命令验证服务器模式是否启用

 cmake -E capabilities

在输出中查找”serverMode”:true。请注意即使如下所述的从源代码编译,你也应该在完成后检查功能。你的Linux系统可能有一些限制,从而无法启用服务器模式。例如,由于库和编译器的限制,我们在Ubuntu 14.04上遇到启用服务器模式的问题。

要在Linux系统的shell中从源代码开始构建,请确保你的软件包管理是最新的并可以使用git和cmake,然后再克隆CMake源。

 sudo apt-get update
sudo apt-get install -y git cmake
git clone https://github.com/Kitware/CMake.git
cd CMake

现在,请确保你正在使用一个支持CMake的Visual Studio版本。我们正在积极跟踪CMake的发展,但我们不能保证我们支持最新的。目前,我们支持到3.9版本,你可以通过运行确保你的构建。

 git checkout tags/v3.9.0

现在开始创建并安装一个支持的版本,运行下列的命令。

 mkdir out
cd out
cmake ../
make
sudo make install

上面的命令将会创建并安装一个当前版本的CMake到/usr/local/bin。确认版本大于等于3.8并且服务器模式是启用的。

 /usr/local/bin/cmake –version
cmake -E capabilities

预览1中的一些限制

这是我们对Linux的CMake支持的第一次预览发布。这些是我们正在积极研究的一些已知的限制。

对于较大的项目,可能会出现文件复制步骤被卡住,因为我们当前没有使用进度更新输出窗口。对于像bullet3这样的项目,初始传输可能需要5分钟,在此期间不会有更新。我们将在Preview2中添加输出来报告文件复制状态。

默认情况下,自定义启动选项不起作用。如果从CMake>Debug and Launch Settings(调试和启动设置)菜单生成launch.vs.json,生成的模板不进行修改将无法启动。当在预览2中修复后我们将记录此功能的可用选项。

使用远程linux应用程序启用输出和输入的Linux控制台窗口尚未启用CMake。这是一个局限,这个窗口当前只适用于gdbserver模式,但是我们对Linux的CMake支持仅适用于gdb模式。这将被解决。

下一步

下载Visual Studio 2017 Preview,安装Linux development C++ Workload,使用你的代码试用Linux的CMake支持。让我们知道这个功能怎么样或是不工作。你的反馈很重要。

联系我们的最佳方式是通过our GitHub hosted issue list,或者直接通过邮件 vcpplinux-support@microsoft.com或是在Twitter @robotdad 上找到我。