之前我有一篇文章讲的是使用Visual Studio 2017 创建Linux C++ 项目(使用VS2017调试Linux C++代码)。使用IDE的好处就是方便编码和调试,工作中也一直以这种方式开发Linux平台的项目,大概使用了两年多,感觉总体上可以满足开发需求,但是还存在一些bug,或者说令人不太满意的地方。

问题1:本地文件和远程同步问题
项目中如果有脚本或者配置等文本文件,由于这些文件不参与编译,在生成的时候只是同步到Linux系统,然而这个同步触发不是直接和文件是否有改动相关的,而是与编译文件(cpp或头文件)相关的。如果这些文件改动了,还必须要有cpp或者头文件被改动,才会触发同步。有时候需要改配置文件或脚本文件,改完之后,要同步过去怎么办?每次我只能去找一个cpp改一下(添加个空格之类的操作),再去生成,才可以同步到远程Linux项目中去。

问题2:需要手动添加文件
我记得使用Visual Studio创建的Windows 项目可以在工程中一次性直接添加一个已有的包含文件夹及源文件的目录,而且自动保持目录结构,然而创建的Linux项目就不行,要想把已有的包含源代码的目录添加到项目中,需要在项目文件树中创建 筛选器,也就是文件夹,再点击该 筛选器->增加现有项,源文件添加到项目中来,这个对于文件目录结构简单的项目来说还好,然而一般稍微大一点的项目,源文件几百个,不可能放在一个文件夹下,这个既不好看,查找文件也不方便。所以都会按照功能或者业务放在不同的文件夹下面。在开发的过程中,文件是逐渐增加的,其实也还好,但是如果要把已写好的一些文件,添加到另外一个工程中去,这个时候就头疼了,可能一上午都在创建筛选器,添加现有项,这个真的是很麻烦。

问题3:版本变化,带来功能上的不兼容
Visual Studio 版本的变化有些功能会发生变化,记得将Viusal Studio 2017 升级到2019后,项目编译不过,提示头文件找不到。在项目属性中有好几个可以添加头文件包含路径的地方,后来调整了一下这些地方,而且有些填写路径的地方要绝对路径才可以,后来改了这些参数设置后才编译通过。

问题4:Visual Sutdio特有的项目文件问题
和别人一起开发时,大家都添加了新文件到一个项目中,此时项目文件.vcxproj.filters冲突了,如果合并错了,这个时候你在打开项目,所有的源文件都堆放在一起了,只有手动修改.vcxproj.filters
由于每个工程都是需要项目文件.vcxproj描述,而且有些参数必须要绝对路径,这里还存在一个问题:如果公司里面是多个人公用一台Linux机器,进行远程开发,每个人在/home下都有一个自己的用户空间,那么对于一个项目每个人的.vcxproj文件就会不一样,然而这个文件是应该和其他源文件一样被版本工具管理,但是尴尬的是你不能别人的.vcxproj文件,因为两个人的用户空间不一样,有些路径参数不一致,这样是无法协同工作的。为了解决这个问题,就得想办法让每个人的项目文件都一样,把不一样的留在每个人的本地,不归版本工具管理。具体实现参考:使用Docker+Visual Studio 2019搭建Linux C++开发环境

以上四点是我认为Visual Studio 开发Linux 项目不好用的地方,对于刚从Windows平台转向Linux开发的人来说这种方式很好,很容易上手,能很快将精力投入到开发中。长时间使用这种方式开发,如果能接受以上这些问题,那没问题,如果觉得不好用,也没关系,Visual Studio还有另外一种项目组织方式CMake 项目即:生成不依赖于.sln或.vcxproj文件的新式跨平台C++应用。Visual Studio 2017不记得有没有这个功能,在2019上是有的,下面演示创建一个CMake项目:

打开Visual,创建项目,找到CMake项目,创建该类型项目,创建好的CMake项目目录结构如下:

->ProjectDir			// 项目根目录
  ->CMakeLists.txt		// CMake脚本文件
  ->CMakeProject.cpp	// 源文件
  ->CMakeSettings.json	// CMake配置文件

在该项目中的最顶层目录下,有CMakeLists.txt,这就相当于是CMake项目的项目文件。CMake本身有一套脚本语言规范,按照CMake脚本语法编写脚本控制编译过程,这个自由度完全掌握在自己手里,并且以脚本的形式去实现。

CMakeSettings.json文件用来设置CMake相关的参数,环境变量等,如下是创建项目时自动添加的一个CMakeSettings配置:

{
  "configurations": [
    {
      "name": "x64-Debug",
      "generator": "Ninja",
      "configurationType": "Debug",
      "inheritEnvironments": [ "msvc_x64_x64" ],
      "buildRoot": "${projectDir}\\out\\build\\${name}",
      "installRoot": "${projectDir}\\out\\install\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "-v",
      "ctestCommandArgs": ""
    }
  ]
}

可以指定一些配置参数,比如编译路径,安装路径等等。

具体参阅 https://go.microsoft.com//fwlink//?linkid=834763

以上x64-Debug是Windows平台的,我们要看Linux平台的时如何创建何使用的。

在左边资源管理器中右击CMakeSettings.json,点击“编辑CMake设置”,就可以添加新的配置
在这里插入图片描述
如上图,添加一个Linux-Debug配置,此时CMakeSettings.json中就会多一个Linux-Debug配置。

{
  "configurations": [
    {
      "name": "x64-Debug",
      "generator": "Ninja",
      "configurationType": "Debug",
      "inheritEnvironments": [ "msvc_x64_x64" ],
      "buildRoot": "${projectDir}\\out\\build\\${name}",
      "installRoot": "${projectDir}\\out\\install\\${name}",
      "cmakeCommandArgs": "",
      "buildCommandArgs": "-v",
      "ctestCommandArgs": "",
      "variables": []
    },
    {
      "name": "Linux-Debug",
      "generator": "Unix Makefiles",
      "configurationType": "Debug",
      "cmakeExecutable": "/usr/bin/cmake",
      "remoteCopySourcesExclusionList": [ ".vs", ".git", "out" ],
      "cmakeCommandArgs": "",
      "buildCommandArgs": "",
      "ctestCommandArgs": "",
      "inheritEnvironments": [ "linux_x64" ],
      "remoteMachineName": "${defaultRemoteMachineName}",
      "remoteCMakeListsRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/src",
      "remoteBuildRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/build/${name}",
      "remoteInstallRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/install/${name}",
      "remoteCopySources": true,
      "rsyncCommandArgs": "-t --delete --delete-excluded",
      "remoteCopyBuildOutput": false,
      "remoteCopySourcesMethod": "rsync",
      "addressSanitizerRuntimeFlags": "detect_leaks=0",
      "variables": []
    }
  ]
}

cmakeExecutable:这个字段指示Linux系统中cmake可执行文件的路径,这里要使用微软的一个cmake分支,支持server mode的cmake。一般在第一次生成的时候找不到cmake就会提示:“是否下载cmake二进制文件”,可能是因为网络的原因,点了下载也是下载不下来的,后面我会将二进制文件上传到csdn上供大家下载。

remoteMachineName:这个字段指示将要连接的远程Linux系统的一个连接。这个连接在 工具-》选项-》跨平台-》连接管理器中添加,添加好之后,这个字段只需要为它选择一个连接就可以了。

remoteCMakeListsRoot:工程文件在Linux系统中的路径。

remoteBuildRoot:编译路径。

remoteInstallRoot:安装路径,这个对应于CMake中的CMAKE_INSTALL_PREFIX参数。

设置好相关配置,就可以生成,编译了。

使用CMake这种方式去开发,能实现跨平台开发,因为CMake就是一个跨平台的工具,其次文章开头讲的那几个问题,在CMake项目中都不存在。可见,随着CMake的加入,Visual Studio开发Linux项目变得更加方便和灵活。

Logo

更多推荐