C++后端开发之Sylar学习二:配置VSCode远程连接Ubuntu开发

C++后端开发之Sylar学习二:配置VSCode远程连接Ubuntu开发

没错,我不能像大佬那样直接在Ubuntu上面用Vim手搓代码,只能在本地配置一下VSCode远程连接Ubuntu进行开发咯!
本篇主要是讲解了VSCode如何配置ssh连接Ubuntu,还有如何使用VSCode和CMake进行编译与调试。

Ubuntu开启ssh服务

  • 安装ssh
sudo apt install openssh-server 
  • 安装完毕后,开启ssh服务
sudo systemctl start ssh
  • 查看是否开启成功
sudo ps -e |grep ssh

在这里插入图片描述

ssh-agent表示ssh-client启动,sshd表示ssh-server启动,两个都开了就可以

  • 设置开机自启
sudo systemctl enable ssh
  • 设置后重启Ubuntu
reboot
  • 重启后检查ssh是否自动启动成功
sudo systemctl status ssh

出现active (running)即可
在这里插入图片描述

VSCode远程连接Ubuntu

安装插件Remote-SSH

在这里插入图片描述
配置主机信息,点击左侧的远程连接标志,再点击设置按钮
在这里插入图片描述
选择第一个config文件
在这里插入图片描述
第一行Host任意填,第二行为Ubuntu虚拟机的ip地址,第三行为你Ubuntu虚拟机的用户名
在这里插入图片描述
设置后刷新一下就在下面的列表中显示出来了
在这里插入图片描述
然后测试连接
在这里插入图片描述
选择平台
在这里插入图片描述
然后根据提示输入密码,连接成功会在左下角显示。
在这里插入图片描述
然后就可以在左侧的第一个资源管理器中打开我们Ubuntu上面的文件夹了。

远程连接失败怎么办?

我第一次配置遇到的问题是“过程试图写入的管道不存在”
在这里插入图片描述
首先用Windows自带的CMD试试能不能远程连接
输入ssh Ubuntu登录用户名@Ubuntu的IP地址,然后回车输入密码即可
在这里插入图片描述
可以看到是正常的,说明我们的SSH是没问题的。
如果这一步连接不上,就要检查下面这三个地方了:

  • Ubuntu的ip地址正确吗?
    • 输入ip a检查ip地址
  • ssh是否启动成功?
    • 通过上面安装ssh的步骤检查
  • 用户名有没有输入正确
    • 查看Ubuntu的用户名
  • 如果问题是Setting up SSH Host XX:Copying VS Code Server to host with scp
    • 查看Setting up SSH Host XX:Copying VS Code Server to host with scp

回到我的问题中,既然我的ssh没有问题,那么就是VSCode的ssh没有配置好
首先在cmd中输入where ssh,可以看到有两个ssh.exe
在这里插入图片描述
而通过检查我的VSCode远程连接时的输出日志发现,它使用的是我的第一个ssh.exe,而CMD能够远程连接因为它使用的的第二个ssh.exe

那就好办了,在VSCode设置一下我的ssh.exe文件路径即可:

  • 打开设置,搜索Remote-SSH
  • 在这里插入图片描述
    在这里插入图片描述
  • 在Remote.SSH: Path中填入ssh.exe的路径
    在这里插入图片描述
    再次测试远程连接成功。

怎么关闭远程连接

远程连接后,想要关闭远程连接就点击左下角
在这里插入图片描述
然后在弹出来的窗口中点击”关闭远程连接“即可
在这里插入图片描述

注意事项

当你远程连接Ubuntu之后,会在你的Ubuntu创建一个VSCode的环境,如果从VSCode安装插件默认是安装到你的Ubuntu的VSCode环境里面,想安装到本地需要关闭远程连接再安装。

怎么远程开发

配置Doxygen模板

参考教程1
参考教程2

  • VSCode安装插件
    在这里插入图片描述
  • 配置模板
    点击设置,搜索doxdocgen,然后编辑setting.json
    在这里插入图片描述
    我自用的模板如下
   // 注释
    "doxdocgen.c.triggerSequence": "/**",   // 触发自动注释的生成
    "doxdocgen.c.commentPrefix": " * ",     // 注释行的前缀
    "doxdocgen.c.firstLine": "/**",         // 注释行的首行
    "doxdocgen.c.lastLine": " */",          // 注释行的尾行

    // file注释顺序
    "doxdocgen.file.fileOrder": [
        "custom",    // 自定义选项
        "empty",  
        "file",
        "date",
        "brief",
        "author",
        "version",
        "empty",
        "custom",    // 自定义选项
        "copyright",
        "custom"    // 自定义选项           
    ],
    // file自定义选项
    "doxdocgen.file.customTag": [
        "************************************************************************",
    ],

    "doxdocgen.file.copyrightTag": [                                // file注释
        "@copyright Copyright (c) {year} By Author"
    ],
    "doxdocgen.generic.authorEmail":    "name@youremail.com",         // {email}  样式
    "doxdocgen.generic.authorName":     "Author",                // {author} 样式
    "doxdocgen.generic.dateFormat":     "YYYY-MM-DD",               // {date}   样式

    "doxdocgen.generic.dateTemplate":   "@date{indent:9}{date}",    // {date}   模板
    "doxdocgen.file.fileTemplate":      "@file{indent:9}{name}",    // {name}   模板
    "doxdocgen.generic.briefTemplate":  "@brief{indent:9}描述",
    "doxdocgen.file.versionTag":        "@version{indent:9}0.1",
    "doxdocgen.generic.authorTag":      "@author{indent:9}{author}({email})",

    // generic注释的内容和顺序
    "doxdocgen.generic.order": [
        "custom",       // 自定义选项
        "brief",
        "param",
        "return",
        // "empty",
        "author",
        "date",
        "custom",       // 自定义选项
    ],
    // generic自定义选项
    "doxdocgen.generic.customTags": [
        "************************************************************************",
    ],
    "doxdocgen.cpp.tparamTemplate": "@tparam {param} ", // ???
    "doxdocgen.generic.paramTemplate": "@param{indent:9}{param}{indent:21}参数描述",
    "doxdocgen.generic.returnTemplate": "@return{indent:9}{type} ",
    "doxdocgen.generic.includeTypeAtReturn": true,      // return 中包含类型信息
    "doxdocgen.generic.boolReturnsTrueFalse": false,    // bool 返回值拆分成 truefalse 两种情况
    "doxdocgen.generic.linesToGet": 4,                  // 回车后最多向下多少行去找函数声明
    "doxdocgen.generic.useGitUserName": false,          // {author} 是都根据 git config --get user.name 替换
    "doxdocgen.generic.useGitUserEmail": false,    

编辑好记得保存,使用方法就是,在代码前面一行开头输入/**,然后回车即可

  • 效果如下

在这里插入图片描述

CMake推荐教程

  • CMake 良心教程,教你从入门到入魂
  • CMake官方教程示例
  • CMake简明教程(中文版)
  • CMake 语法与实战入门
  • CMake使用详解
  • CMake编译选项解析
  • Linux环境下使用VScode调试CMake工程
  • VSCode + CMake 编译调试
  • VSCode+CMake 配置launch.json和tasks.json

配置CMake(编译)

在上一篇文章中,我们已经安装了CMake,想要编译一个项目,假设我们当前处于CMakeLists.txt文件同级目录的build文件夹下,我们编译生成的项目和可执行文件都将放在这个目录,我们只需要执行以下三条命令

cmake ..
cmake --build .

第一条命令是指定CMakeLists.txt 所在路径,并生成相应的构建系统文件。此时在 build 目录下,所以用 … 表示 CMakeLists.txt 在上一级目录,通俗地讲就是把CMakeLists.txt里面的代码执行了一遍。
第二条命令是指定编译生成的文件存放目录,然后编译和构建项目,生成目标文件,. 表示存放到当前目录
第二条命令也可以写成

make

但是,我们想通过VSCode开发,为了能够在CMake中进行编译和调试我们的项目,就需要在VSCode中配置一下我们的CMake,这样就不需要再去手动执行上面的三条命令了。
有个傻瓜式的配置方法,不需要配置task.json和launch.json这两个文件,可以参考这个教程,使用最简单的方法来配置CMake。

这里我使用的是通过配置task.json和launch.json来配置CMake的编译和调试任务(不管是哪种方法都需要安装下面的这三个插件)。
首先,VSCode连接上我们的Ubuntu,然后安装C/C++、CMake、CMake Tools插件
在这里插入图片描述

  • 配置task.json
    • 点击终端-----配置默认生成任务-----选择CMake:生成(英文为CMake:Build)
      在这里插入图片描述
      此时,会在我们的工作区根目录创建一个.vscode文件夹,同时还会在.vscode文件夹生成一个task.json

.vscode 文件夹是 Visual Studio Code(VSCode)中用于存储工作区特定设置的文件夹。在这个文件夹中,你可以包含一些配置文件,以便与你的项目关联的开发环境和编辑器设置能够得到正确的应用。
主要包括以下几个方面的配置:
settings.json 文件: 这个文件包含了工作区特定的设置,这些设置将覆盖全局设置。你可以在其中配置编辑器的行为,例如缩进风格、字体大小、主题等。
launch.json 文件: 用于配置调试器的启动配置,定义了在 VSCode 中如何启动和调试你的应用程序。你可以设置断点、运行参数等。
tasks.json 文件: 该文件允许你定义和配置任务(tasks),比如编译、运行脚本等。你可以在这里配置构建命令、参数等。
这些文件的存在使得你可以在不同的项目中定制你的编辑器环境,而不影响全局设置。在多人协作或者多项目开发中,这种工作区特定的配置非常有用,因为每个项目可能有不同的需求和规范。

把task.json中的内容替换成下面的(没特殊需求可以不改

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "options": {
        "cwd":"${workspaceFolder}/build"
    },
    "tasks": [
        {
            "label": "cmake",
            "type": "shell",
            "command": "cmake",
            "args": [
                ".."
            ],
            "problemMatcher": []
        },
        {
            "label": "make",
            "group": "build",
            "command": "make",
            "args": [],
            "problemMatcher": []
        },
        {
            "label": "CMake_Build",
            "dependsOrder": "sequence",
            "dependsOn": [
                "cmake",
                "make"
            ]
        }
    ]
}

然后保存一下,当需要编译我们的项目时,我们先在项目的CMakeLists.txt的位置新建一个build目录,然后只需要点击终端-----运行任务-----选择CMake_Build
在这里插入图片描述
选择继续而不扫描任务的输出
在这里插入图片描述
然后VSCode就会帮我们执行cmake …和make命令效果和在Ubuntu中执行是一样的。

配置CMake(调试)

编译配置好了,就可以配置我们的调试了
先点击左侧的“调试”图标,然后选择创建launch.json文件
在这里插入图片描述
然后在.vscode文件夹中就会生成一个launch.json
替换其中的内容如下(需要修改program的值为项目生成的目标名,我这里目标名是Tutorial;需要修改args,如果不需要命令行传递参数,设置为空列表[ ]即可

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) 启动",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/Tutorial",
            "args": ["1","2","3"],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask":"CMake_Build",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

我们的调试环境就配置好了,需要说明的是,其中的这一行代码

  "preLaunchTask":"CMake_Build"

是可以不要的,这行代码的目的是在调试之前先执行一下“CMake_Build”任务,也就是我们上面定义的编译任务,目的就是,在我们对代码做出更改后,调试的时候可以保证是对我们最新的代码进行的调试,如果不进行编译,那么由于生成的目标文件还是原来的,导致我们还是在调试修改前的代码,综上,建议保留。
调试的时候按F5或者点击左侧的调试图标,然后使用“gdb启动”调试即可。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/371636.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯每日一题-----数位dp练习

题目 链接 参考代码 写了两个,一个是很久以前写的,一个是最近刚写的,很久以前写的时候还不会数位dp所以写了比较详细的注释,这两个代码主要是设置了不同的记忆数组,通过这两个代码可以理解记忆数组设置的灵活性。 im…

UE4运用C++和框架开发坦克大战教程笔记(十七)(第51~54集)

UE4运用C和框架开发坦克大战教程笔记(十七)(第51~54集) 51. UI 框架介绍UE4 使用 UI 所面临的问题以及解决思路关于即将编写的 UI 框架的思维导图 52. 管理类与面板类53. 预加载与直接加载54. UI 首次进入界面 51. UI 框架介绍 U…

【C++】运算符重载详解

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读 1. 为什么需要运算符重载 2. 运算符重载概念 3. 运算符重载示例 3.1 运算符重载 3.2 >或<运算符 4. 运算符重…

2024最新最详细【接口测试总结】

序章 ​ 说起接口测试&#xff0c;网上有很多例子&#xff0c;但是当初做为新手的我来说&#xff0c;看了不不知道他们说的什么&#xff0c;觉得接口测试&#xff0c;好高大上。认为学会了接口测试就能屌丝逆袭&#xff0c;走上人生巅峰&#xff0c;迎娶白富美。因此学了点开发…

分享个前端工具-取色调色工具

这里虽然贴了两个&#xff0c;但推荐 Pipette. PipetteWin22.10.22.zip: https://download.csdn.net/download/rainyspring4540/88799632 图标&#xff1a; 界面&#xff1a; ColorPix https://download.csdn.net/download/rainyspring4540/88799642 图标&#xff1a; 界面…

【Spring】自定义注解 + AOP 记录用户的使用日志

目录 ​编辑 自定义注解 AOP 记录用户的使用日志 使用背景 落地实践 一&#xff1a;自定义注解 二&#xff1a;切面配置 三&#xff1a;Api层使用 使用效果 自定义注解 AOP 记录用户的使用日志 使用背景 &#xff08;1&#xff09;在学校项目中&#xff0c;安防平台…

FastAdmin西陆房产系统(xiluHouse)全开源

应用介绍 一款基于FastAdminThinkPHPUniapp开发的西陆房产管理系统&#xff0c;支持小程序、H5、APP&#xff1b;包含房客、房东(高级授权)、经纪人(高级授权)三种身份。核心功能有&#xff1a;新盘销售、房屋租赁、地图找房、房源代理(高级授权)、在线签约(高级授权)、电子合同…

C#实现坐标系转换

已知坐标系的向量线段AB&#xff0c;旋转指定角度后平移到达坐标AB 获取旋转角度以及新的其他坐标转换。 新建窗体应用程序CoordinateTransDemo&#xff0c;将默认的Form1重命名为FormCoordinateTrans&#xff0c;窗体设计如图&#xff1a; 窗体设计代码如下&#xff1a; 部分…

Redis-缓存问题及解决方案

本文已收录于专栏 《中间件合集》 目录 概念说明缓存问题缓存击穿问题描述解决方案 缓存穿透问题描述解决方案 缓存雪崩问题描述解决方案提高缓存可用性过期时间配置熔断降级 总结提升 概念说明 Redis是一个开源的内存数据库&#xff0c;也可以用作缓存系统。它支持多种数据结构…

前端小案例——动态导航栏文字(HTML + CSS, 附源码)

一、前言 实现功能: 这案例是一个具有动态效果的导航栏。导航栏的样式设置了一个灰色的背景&#xff0c;并使用flex布局在水平方向上平均分配了四个选项。每个选项都是一个li元素&#xff0c;包含一个文本和一个横向的下划线。 当鼠标悬停在选项上时&#xff0c;选项的文本颜色…

华为自动驾驶干不过特斯拉?

文 | AUTO芯球 作者 | 李诞 什么&#xff1f; 华为的智能驾驶方案干不过蔚小理&#xff1f; 特斯拉的智能驾驶[FSD]要甩中国车企几条街&#xff1f; 这华为问界阿维塔刚刚推送“全国都能开”的城区“无图 NCA” 就有黑子来喷了 这是跪久了站不起来了吧 作为玩车14年&…

get通过发送Body传参-工具类

1、调用方式 String url "http://ip/xxx/zh/xxxxx/xxxx/userCode"; //进行url中的对应的参数 url2 url2.replace("ip",bancirili); url2 url2.replace("zh",zh); url2 url2.replace("userCode",userCode);String dateTime xxxx; //组…

04. 【Linux教程】安装 Linux 操作系统

通过前面的小节学习&#xff0c;我们已经对 Linux 操作系统有了简单的了解&#xff0c;同时也在 Windows 下安装了虚拟机软件 VMware &#xff0c;那么本节课我们就介绍下如何使用虚拟机软件安装 Linux 操作系统。 通过第一小节的学习我们知道 Linux 有很多的发行版本&#xf…

Vscode配置STM32开发环境(联合Keil MDK/IAR开发)

Vscode配置STM32开发环境&#xff08;替代Keil MDK/IAR&#xff09; 前言 使用了很长时间的Keil5 MDK&#xff0c;以及最近用了一段时间的IAR for ARM&#xff0c;总体来说体验都不是特别的好&#xff0c;Keil功能还行&#xff0c;也不卡顿&#xff0c;就是开发效率、界面样式…

1-2 动手学深度学习v2-基础优化方法-笔记

最常见的算法——梯度下降 当一个模型没有显示解的时候&#xff0c;该怎么办呢&#xff1f; 首先挑选一个参数的随机初始值&#xff0c;可以随便在什么地方都没关系&#xff0c;然后记为 w 0 \pmb{w_{0}} w0​在接下来的时刻里面&#xff0c;我们不断的去更新 w 0 \pmb{w_{0}…

asp.net core 依赖注入 实例化对象实例

在面向对象编程中&#xff0c;推荐使用面向接口编程&#xff0c;这样我们的代码就依赖于服务接口&#xff0c;而不是依赖于实现类&#xff0c;可以实现代码解耦。 名称解释&#xff1a; 我们把负责提供对象的注册和 获取功能的框架叫作“容器”&#xff0c; 注册到容器中的对象…

Android BitmapShader setLocalMatrix缩放Bitmap高度重新onMeasure,Kotlin

Android BitmapShader setLocalMatrix缩放Bitmap高度重新onMeasure&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://sc…

macbook死机了按什么键重启?CleanMyMac怎么清理MacBook

当您的macbook出现死机情况&#xff0c;您可以尝试以下几种方法来重启&#xff1a; 强制重启&#xff1a; 如果只是某个应用程序卡住&#xff0c;可以使用Command Option Esc组合键强制退出该应用。对于持续性的卡顿或死机&#xff0c;可以通过点击菜单栏上的苹果图标&#…

2024清洁能源、环境与智慧城市国际研讨会(ISCEESC2024)

2024清洁能源、环境与智慧城市国际研讨会(ISCEESC2024) 会议简介 2024年清洁能源、环境与智慧城市国际研讨会&#xff08;ISCEESC2024&#xff09;将在中国丽江举行。本次会议主要围绕清洁能源、环境和智慧城市等研究领域&#xff0c;旨在为该研究领域的专家学者提供一个国际…

【SpringBoot】RBAC权限控制

&#x1f4dd;个页人主&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;SpringBoot⛺️稳重求进&#xff0c;晒太阳 权限系统与RBAC模型 权限 为了解决用户和资源的操作关系&#xff0c; 让指定的用户&#xff0c;只能操作指定的资源。 权限功能 菜单权限&a…