VS Code构建C++远程开发环境IDE
1. 前言
由于工作的需要,近期准备在Linux下开发C++程序。之前一直通过CLion直接在Linux机器上开发,然而由于我的笔记本是Windows系统,要切换到Linux总是要切换屏幕和键鼠,体验不够流畅。于是希望能够有一个方法能够让我通过Windows远程Linux进行开发,同时也能拥有IDE一般的开发体验。
通过一段时间的调研,也试过不少的方法,总结如下:
- Visual Studio支持的远程Linux开发功能:Visual Studio堪称宇宙IDE,功能强大而且Windows和Linux的开发体验一脉相承。然而程序体积庞大,并且配置较复杂,启动时间较长。如果希望使用cmake来进行项目构建,Visual Studio所提供的cmake模板与常规在Linux下构建cmake项目的模板结构有些差异。使用起来不太顺手;
- CLion的远程开发功能:配置相对简单,编程体验也非常优秀(尤其是CLion自带的很多重构方式,极大提升编程效率)。然而远程开发首先要在本地构建项目,然后通过CLion将项目文件传输到目标Linux机器,然后才开始调试。不能实现直接打开远端的项目(可能我没找到) 来进行编程。因此放弃这种方式;
- 通过x11vnc来远程Linux编程:在网络不好的时候,编程体验非常糟糕;
- 通过xming+putty来启动远程CLion进行编程:同样在网络不好的时候编程体验非常差。而且不能实现本地机器和远程机器之间Copy and Paste;
- 通过ssh+tmax+vim来进行编程:对于动手能力强的同学,这是最推荐的做法。然而VIM的学习成本高,要配置出如IDE的编程体验,需要安装和配置很多插件。没有一定的动手和钻研能力,建议不要轻易尝试。(个人通过2-3周的尝试和适应,最后还是选择放弃);
- 通过VS Code进行远程开发:承袭VS Code的编程体验,流畅度和稳定度都非常良好。而且程序较轻量,打开速度很快。各种插件几乎涵盖日常编程需求。各种语言都可以统一在VS Code下面来编写(个人觉得这个特点非常优越)。美中不足就是毕竟不是传统IDE,在一些重构和自动生成的功能不如Visual Studio和CLion。不过瑕不掩瑜,这是当前个人最提倡的远程开发C++的方式;
2. 准备工作
- 操作系统:本机Win10,远程机器Ubuntu 18.04
- VSCode: 1.41
- CMake: 3.14.7
- VSCode插件:
3. 环境搭建
3.1 Remote SSH配置
根据官方文档,点击配置教程
完成配置后,VSCode已经具备常用SSH Client和所有功能:
- 可以方便的从本地机器复制黏贴文件和文本到远程机器;
- 可以通过Terminal完成所有命令行操作
- 可以远程开启服务器上的项目进行开发
- 更多功能逐步发掘中
3.2 CMake配置
利用CMake配置可以十分方便的构建C++开发项目并且进行调试、测试、安装及部署。然而CMake本身就是一个非常灵活且复杂的工具,如果想要非常仔细的了解,建议阅读CMake官方文档
下面是一些我认为比较好的参考资料:
3.3 VS Code项目配置
通过Ctrl+P
,选择"Edit Configuration(UI)",VSCode会自动在项目路径中添加.vscode
文件夹,并且添加必要的内容,如"c_cpp_properties.json"和"settings.json"。
c_cpp_properties.json
的内容大概如下
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**", // 将本地工作目录添加到include路径中,
// 这样本地的所有头文件都可以被VSCode索引,这样编辑就不会触发红色的波浪线;
"/usr/include/**" // 将Linux下的引用路径添加到include路径中,
// 对于一些第三方依赖库,如Boost的头文件,就能被VSCode索引
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64"
}
],
"version": 4
}
3.4 配置 launch.json
launch.json
文件是告知VSCode在启动调试过程中如何启动程序,类似Visual Studio的调试选项。内容大概如下:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/[你的制定程序路径] 例如:/build/bin/xxx.out",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}/build/bin", //这是你的工作目录,可以根据需要调整
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"preLaunchTask": "build debug", // 这是在调试之前需要执行的任务,需要跟task.json文件配合起来工作
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
3.5 配置 tasks.json
tasks.json
文件是告知VSCode如何定义和执行一些任务,这些任务可以在编译前执行,也可以在编译后执行。通过tasks.json
,VSCode获得极大的配置灵活性,而且也能很好的满足自动化需求。文件内容大概如下:
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build debug",
"type": "shell",
"linux": {
"command": "mkdir -p build && cd build && cmake -DCMAKE_BUILD_TYPE=Debug ../ && make", // 这项配置是定义在每次编译之前都会执行一遍cmake
}
}
]
}
3.6 测试
当配置好上述文件和插件之后,通过Ctrl+F5
可以提请调试模式,VSCode会根据launch.json
里面的内容,首先找到preLaunchTask
定义的任务首先去执行cmake等编译任务,然后再进入到调试状态。通常可以通过Ctrl+F7
先进行cmake的编译,如果有问题可以比较直观的显示出问题存在的文件和行数。
4. 问题解决(持续更新)
-
调试过程中受到
SIGUSR1
的报错导致调试中断这个问题主要是GDB内部的问题,某些程序在运行过程中收到
SIGUSR1
,GDB如果没有设定对于这些信号的处理的方法的话,默认是会中断程序的。所以如果想要不中断程序,直接忽略SIGUSR1
的信号,则需要在gdb里面设置一下handle SIGUSR1 nostop
。设置的方法如下:- 方法一:在命令行中输入:gdb [执行程序,如xxx.out] => 在进入gdb之后,输入handle SIGUSR1 nostop。该方法只适合直接使用gdb进行调试时使用,如果希望每次调用gdb的时候都能执行该命令,则使用方法二;
- 方法二:在个人的home目录中,例如cd ~,进入/home/user/的目录; 然后家里一个文件.gdbinit,在文件中输入handle SIGUSR1 nostop。则以后启动gdb的时候都会带有该项设置。