搭建VS2017 Linux CMake开发环境

2021-10-29 15:03:59 浏览数 (1)

需要安装的软件

1. VS2017

本文用来测试的版本是VS2017.15.9.8 内网(\192.168.80.20) 有相应的离线安装包

如图所示, 我们需要勾选这些组件.

2. VMWare和CentOS7镜像

本文用来测试的版本是VMWare15.0.0 以及猎人3D项目组用的CentOS7镜像.

3. CMake 3.12

建议直接使用CMake3.12, 这个版本实测通过, 过低版本没有Server Mode的支持, 过高版本可能存在兼容性问题, 直接在官网下载源码编译安装即可, 在远程服务器上通过cmake –version确认版本号, 通过 cmake –E capabilities 查看ServerMode是否为True

4. GCC8.2(可选)

由于用来测试的猎人3D服务器使用了部分C 14的特性, CentOS对应的GCC版本使用的是8.2(实测如果C 代码没有使用新特性, GCC4.8也能与VS良好的协同工作).

5. 一份服务器代码

本文使用的服务器代码是公司内部在研项目的服务器代码, 通过对原来的CMake配置做一些调整更新, 最后得到一份可以在VS模式下良好工作的代码. (具体调整过程略去)

6. SecureCRT或其他SSH软件

使用SecureCRT连接CentOS7, 确保SSH的可用性, 也可以使用其他个人习惯的SSH连接软件.(因为VS本身就是通过SSH方式对远程Linux主机进行访问, 我们先需要先确保SSH连接的可用性)

初步的环境测试

1. VMWare 连通性测试

上图是笔者的VMWare网络设置和CentOS内的IP配置, 目前配置的虚拟机IP是192.168.183.100, 我们先确认虚拟机网络的联通性:

先在Windows中确保远程主机是可联通的.

接下来我们使用SecureCRT对远程CentOS7主机进行连接测试:

确保远程CentOS7的主机是可以通过SSH访问的(不能访问请自行查阅SSH服务配置相关文章, 本文略过).

VS2017的基本配置

打开VS, 访问菜单栏 Tools->Options, 选择 Connection Manager选项卡, 点击Add按钮, 在弹出的Connect面板中正确配置SSH连接参数:

点击Connect按钮后, VS会自动进行连接测试并尝试下载远端的头文件.

利用上图的选项卡可以确认相关头文件的状态. 点击Explore按钮可以查看从远端下载的头文件, 正确下载头文件后, 在VS中, VA可以正确提示Linux相关的函数与结构体, 方便我们编写和查看相关代码。具体效果如下图所示:

如图所示, VA可以正确的提示linux相关的系统函数和结构体, 方便我们编写代码. 我们也可以直接跳转到对应头文件查看函数和结构体的具体声明, VA相关的用法本文不详细介绍, 不是必须功能, 直接使用VS自带的智能提示等, 也是可以的.

基本的VS测试工程

VS对Linux工程的组织有两种形式, 我们都进行简单的介绍.

1. VS Project组织方式

我们可以通过VS2017的菜单项打开新建工程面板(VS2017->File->New->Project), 我们先如图所示选(Console Application(Linux))模式, 测试VS Project方式的Linux工程.

如上图所示, 我们先在main.cpp中设置断点, 再点击运行程序的按钮:

会得到如上图所示的运行界面, 与常规的VS Windows程序开发过程相近, 需要注意的是红色箭头标注的Linux Console Window, 有需要的时候, 我们也可以通过Debug->Linux Console菜单项打开该窗体, 运行失败的时候, 该窗体可能会给出更具体的报错提示.

需要注意几点:

  1. 首先, 我们切换到Build日志面板来看一下生成的过程:

通过以上日志我们可以看到编译的具体过程, 一些编译过程中的报错也会直接在此处显示.

  1. 接下来我们来看一下具体的工程配置:

此处我们可以配置使用的远端SSH连接, 远程的工程目录等, 方便确认远端资源的有效性. 如上图所示, VS会自动帮我们拷贝并同步文件到远端/home/admin/projects/testlinuproj下, 如下图所示:

  1. 整体来说, 这种模式与传统的VS工程高度一致, 相关的配置项和配置方式也高度一致, 如果只是进行小规模代码的测试, 建议使用这种模式对工程进行组织和配置, 这应该是最简单直接的VS Linux开发工程组织方式了.

2. CMake Open Folder工程组织方式

类同上面的Linux Project模式, 我们使用(VS2017->File->New->Project)菜单项来打开新建工程面板, 如上图所示, 我们创建的是一个跨平台的CMake项目, 默认是针对Windows平台的, 我们需要在接下来的操作中切换项目的目标平台并进行相应配置.

CMake方式创建的工程是一种特殊类型的工程, 是VS2017开始支持的一种叫”Open Folder” Project的类型, 与Sublime等通过文件夹对源代码进行组织和编辑的方式是对等的, 所以我们并不会在对应的工程目录下看到原来的*.sln和*.xxproj文件, 算是VS一项比较重大的进化, 对于利用CMake组织的源代码工程来说, 能够最大限度的减少大家重复性的组织工程和相关配置, 最简化开发过程, 具体的优缺点大家可以自行体会, 此处不再赘述.

  1. 首先, 我们先把CMake工程的目标平台按如下图所示的方式调整到Linux:
  1. 选择select后, 会自动创建一个”CMakeSettings.json”, 基本VS对CMake工程相关的配置都存储在该文件中, 这样可以保证不污染到原来的CMake配置.
  2. 我们简单说明一下该文件的对应配置项:
  1. 显示在工具栏的配置名称, 如果存在多个配置项, 我们可以直接在工具栏进行切换(比如Debug, Release版的切换)
  2. 这个是存放源代码的位置, 具体操作的时候可以不使用宏, 直接使用绝对路径给出.
  3. 远程CMake的Build目录, 可以直接看成是生成CMake Cache Files和最终可执行程序的目录.
  4. 远程安装目录
  5. 是否自动拷贝本机代码到远程, 此处我们可以选择手工在远程检出代码, 但建议还是配置成true, 方便在本机修改代码后远程直接使用新修改的代码进行Build
  6. 拷贝源代码的方式(目前支持rsync, sftp), 默认推荐使用rsync, 如果远程机器没有配置rsync, 可以自行切换到sftp方式.
  7. 远端拷贝文件时需要排除的文件列表(如.vs, .git, .svn都可以配置成忽略项, 避免拷贝不需要的文件).
  8. 编译参数, 建议根据机器核数配置 “-j8” 选项, 开启并行编译, 加速编译过程, 后面的数字8可以自行根据远端机的硬件情况设置, 一般推荐是机器的核数*2, 比如我目前的远端机器Cpu核数是4, 我就用的 “-j8”, 可自行去掉对应参数和添加对应参数测试加速情况, 目前拿猎人3D的工程进行测试, 加速效果比较明显.
  9. 工程视图的切换:

点击此处, 我们会发现我们可以工作在两种工程视图下, 一种是文件夹模式,另外一种是CMake本身配置的Target模式.区别可以看下图来对比:

(文件夹模式)

(Cmake Target模式)

通过上图的对比, 我们可以看到CMake Target模式会自动帮我们列出不同Target使用的源文件, 方便我们阅读和编辑代码(注意, 此处不是按文件夹绝对路径来组织的树状结构)

  1. 此处如下图所示对CMake的当前执行Target进行切换:
  1. 点击运行后如下图所示, 跟VS Proj模式基本一致:
  1. 启动项设置说明:

此处要注意的是我们可以对启动项进行配置, 包括启动目录, 附加的命令行参数, 都可以进行相关配置. 具体方法如下图所示, 右击对应的CMake Target工程, 点击Debug and Launch settings菜单项.

系统会自动帮我们建立 launch.vs.json文件, 我们也可以直接访问工程目录下的.vs/launch.vs.json进行编辑。

重要的选项是cwd和args, 我们可能会修改这两项以适应我们的调试需求

  1. “cwd”是程序的启动工作目录
  2. “args”是命令行参数列表, 注意此处每个命令行参数需要单独给一列, 是数组形式给出的. 比如 –c xxx.lua 通常需要在args里给出两项, 一项是”-c”, 一项是”xxx.lua”, 如果只给一个字符串”-c xxx.lua”, VS会认为程序只传入了一个命令行参数, 这通常跟我们需要的效果是不一致的.

3. 远程Linux进程的附加调试

我们除了直接启动对应程序, 也可以对已经在远程执行的程序进行挂接调试, 方法如下:

访问Debug->Attach To Process 菜单项, 打开Attach to Process面板

我们把Connection type如上图所示切换到SSH选项, 正确选择已经在之前的Connection Manager中配置的Connection target, 系统会自动列出当前在远程主机上执行的进程, 我们选择需要调试的进程Attach, 即可对该进程进行断点调试等操作, 与传统的EXE操作基本一致.

0 人点赞