当前位置: 首页 > news >正文

Visual Studio 2022连接远程系统进行C/C++开发

Visual Studio被称为是宇宙最强IDE,以前开发Linux C/C++服务器程序,基本上都是在Windows上使用VS编写跨平台的C/C++代码,然后先在VS中编译、链接、调试,然后在Linux下编译、链接,再针对Linux下的特定代码进行调试。后面VisualGDB的出现,终于有所改变了,参见笔者之前的博文:Windows下开发Linux C/C++项目。

也许是VisualGDB的推波助澜,也许是微软CEO纳德拉的拥抱开源战略,让VS也更加开放,对开发者越来越友好。

以前VS只支持使用微软自己的开发工具进行Windows程序的开发;到VS2008的时候可以安装VisualGDB插件使用GNU的编译套件进行Windows程序的开发也可以通过SSH远程连接到Linux/MacOS系统进行开发;再到VS2017支持火热的CMake系统,可以直接支持SSH远程连接到Linux/MacOS系统进行开发(笔者没用过VS2017、VS2019,直接从VS2015跳到VS2022),到目前的VS2022更是对非微软系的工具(包括GNU的工具和LLVM的工具)支持越来越好,虽然不有不如意的地方,但会越来越好。

以前介绍过VS2022与MinGW的本地开发方式,参见系列博文:
Visual Studio 2022使用MinGW来编译调试C/C++程序
Visual Studio 2022 CMake+MinGW+GDB 调试目标程序
Visual Studio 2022使用CMake+MinGW+Clang+LLDB作为开发环境

本文就介绍一下VS2022使用SSH远程连接到Linux/MacOS进行C/C++的远程开发方式。

本文链接:https://blog.csdn.net/witton/article/details/132297160

一、环境

先介绍一下环境,Windows环境为Win10,VS2022版本为17.7,远程系统为Ubuntu 22.04/CentOS7/MacOS catalina,Linux下又涉及有容器中的Linux。

1.系统准备

关于Linux系统的安装配置,以及相应编译、链接、调试器的安装可以参考博文:
详细安装Ubuntu 21.10
配置与管理Ubuntu 21.10
搭建ubuntu容器内C/C++开发调试环境

如果使用容器,一定要在创建podman容器时添加参数:--cap-add=SYS_PTRACE,创建docker容器时添加参数:--cap-add=SYS_PTRACE --security-opt seccomp=unconfined,否则不能使用调试器。

如果是SSH远程连接到macOS开发,可以看看博文:
SSH远程连接MacOS catalina并进行终端颜色配置

2.开发套件准备

关于GNU套件以及LLVM套件的安装,如果要使用C++20标准,强烈建议使用源码安装最新版本的GCC和最新版本的Clang,如果觉得系统源中已有的版本够用,就可以不用源码安装,直接使用系统源中的版本安装即可。

VS包括VSCode要使用LLDB调试器进行源码调试,都必须要有lldb-mi,所以必须要安装lldb-mi,博文VSCode远程连接Ubuntu使用LLDB调试程序中有介绍lldb-mi的安装。

macOS系统如果安装过VSCode,则可以直接使用VSCode中安装的lldb-mi,将之软链接到/usr/local/bin即可。
在这里插入图片描述

这里需要注意的一点是lldb-mi最好与lldb的安装目录一致,一般为/usr/local/bin。如果是源码安装的,建议都安装在/usr/local/,则都在/usr/local/bin目录下。

如果是使用的系统源的LLDB包安装的,比如ubuntu 22.04中安装的lldb-15,它默认是安装在/usr/lib/llvm-15/bin下,则需要将之添加到PATH路径中,并建立一个lldb-server具体版本号的符号链接到lldb-mi的安装目录下,否则会报错unable to locate lldb-server-XX.X.X

在这里插入图片描述

比如ubuntu 22.04中安装的lldb-15,具体版本号为15.0.7,lldb-mi安装在/usr/local/bin,使用下面命令建立符号链接:

ln -s /usr/lib/llvm-15/bin/lldb-server-15.0.7 /usr/local/bin/lldb-server-15.0.7

lldb-mi README中有提到可以设置环境变量LLDB_DEBUGSERVER_PATH,但是笔者试了一下,没用。

二、项目实例

使用VS2022创建一个CMake项目t,默认会创建四个文件t.ht.cppCMakeLists.txtCMakePresets.json,并且默认是本地计算机x64 Debug配置。CMakePresets.json是CMake的预设配置,它定义了以下几种配置:

  1. 本地计算机,也就是Windows的x64 Debug,x64 Release,x86 Debug,x86 Release
  2. 远程Linux的Linux Debug
  3. 远程MacOS的macOS Debug

是否启用CMake预设配置文件,可以通过菜单工具/选项/CMake来选择:

在这里插入图片描述

1.使用CMake预设配置文件

如果VS启用了CMake预设配置文件,则可以在本地计算机下拉框中选择不同的连接,可以看到不同的预设配置:

在这里插入图片描述
在这里插入图片描述

远程连接可以通过菜单工具/选项/跨平台/连接管理器来管理,最方便的是通过前面本地计算机的下拉列表中选择管理连接直接转到连接管理器页面:

在这里插入图片描述

1.1 添加预设配置

CMakePresets.json中仅定义了几种预设值,比如Linux下仅定义了Linux Debug配置,默认是使用GCC编译器,如果想要使用Clang编译器,则需要添加预设配置。在CMakePresets.json右键菜单中选择“添加配置”:
在这里插入图片描述

再选择“Linux Debug”添加预配置:

在这里插入图片描述
默认会添加如下配置:

{"name": "linux-debug2","displayName": "Linux Debug","description": "面向适用于 Linux 的 Windows 子系统(WSL)或远程 Linux 系统。","generator": "Ninja","binaryDir": "${sourceDir}/out/build/${presetName}","installDir": "${sourceDir}/out/install/${presetName}","cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"},"condition": {"type": "equals","lhs": "${hostSystemName}","rhs": "Linux"},"vendor": {"microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {"sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"}}
}

可以改名为linux-clang-debug,显示名为:Linux Clang Debug,然后添加cacheVariables变量设置C/C++编译器即可:

{"name": "linux-clang-debug","displayName": "Linux Clang Debug","description": "Clang","generator": "Ninja","binaryDir": "${sourceDir}/out/build/${presetName}","installDir": "${sourceDir}/out/install/${presetName}","cacheVariables": {"CMAKE_BUILD_TYPE": "Debug","CMAKE_C_COMPILER": "clang","CMAKE_CXX_COMPILER": "clang++"},"condition": {"type": "equals","lhs": "${hostSystemName}","rhs": "Linux"},"vendor": {"microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {"sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"}}
}

1.2 Ubuntu 22.04/CentOS7配置

目前VS2022连接Ubuntu系统进行调试有性能问题,启动调试器非常慢,不管是使用GDB还是LLDB都非常慢。笔者已经反馈给开发者,目前还在考虑修复中。连接CentOS7进行远程调试没这样的问题。

VS默认情况下是使用GDB进行调试的:
在这里插入图片描述
使用GDB进行调试,有一个不方便的地方就是函数嵌套调用:

#include <iostream>
using namespace std;int f()
{return 1;
}void foo(int i)
{cout << i << endl;
}int main()
{foo(f());cout << "Hello CMake." << endl;return 0;
}

如果调试时在f函数的}F10执行next命令,则会跳过foo函数直接到下一行代码了,如果想调试foo函数就必须按F11执行step命令。这点习惯与VS的调试器习惯不一样,而LLDB调试器与VS的习惯一致。如果知道如何修改GDB的这一行为的读者可以下方留言。

GDB调试器毕竟是老牌调试器,使用很广泛,支持得也比较好,VS默认已经配置并处理好GDB调试器了,所以使用GDB调试器,基本上是一帆风顺。
但如果要使用LLDB调试器,就需要自行添加配置,而且预置的LLDB配置也不完善,有许多麻烦事,而且LLDB使用了许多新技术,注定是一条曲折之路,不过笔者都为大家踩过坑了,大家只需要照搬即可:

在这里插入图片描述
在这里插入图片描述
得到launch.vs.json配置如下:

{"version": "0.2.1","defaults": {},"configurations": [{"type": "cppgdb","name": "CMakeLists.txt","project": "CMakeLists.txt","projectTarget": "","comment": "了解如何配置远程调试。有关详细信息,请参阅 http://aka.ms/vslinuxdebug","debuggerConfiguration": "gdb","MIMode": "lldb","args": [],"env": {}}]
}

projectTarget设置为目标t,此时会有CMakeList.txt选项了:
在这里插入图片描述
原以为就这样简单配置就可以使用LLDB调试器了,毕竟是使用VS的向导生成的。还是想得太简单,启动报错:
Unable to start debugging. Unexpected LLDB output from command "-interpreter-exec console "settings set target.env-vars ASAN_OPTIONS=\"detect_leaks=0\""". Undefined command: "settings". Try "Help".

在这里插入图片描述
VS并没有默认启动lldb-mi来调试,需要指定gdbPath,默认为 /usr/bin/gdb,可以查看文档http://aka.ms/vslinuxdebug,这里需要设置为lldb-mi的路径:/usr/local/bin/lldb-mi。再次启动,就一直卡在Initializing Debugger界面。

在这里插入图片描述
笔者在网上查了很多资料,也没查到相应的配置,咨询了开发者才知道原来还需要加一个"preDebugCommand":"echo",看来LLDB的配置不是一般的复杂啊,暴露了太多细节给开发者了,不知道VS与Linux的交互细节,根本就不知道需要配置这个,为啥需要这条指令。

此时如果连接的是CentOS7系统,会报如下错误:
personality set failed: Function not implemented

在这里插入图片描述
前面笔者写了一文进行分析解决:解决lldb调试时可能出现的personality set failed: Function not implemented

CentOS7由于系统glibc较老没实现personality函数,但Ubuntu 22.04的glibc是实现了的,没此问题。

如果是连接的容器中的Ubuntu 22.04,则会报如下错误:
'A' packet returned an error: 8

在这里插入图片描述
实体机以及虚拟机中的Ubuntu 22.04没此问题。

其实这两个问题都是LLDB禁用了ASLR导致,需要使用settings set target.disable-aslr 0来关闭禁用。

完整配置如下:

{"version": "0.2.1","defaults": {},"configurations": [{"type": "cppgdb","name": "t.lldb","project": "CMakeLists.txt","projectTarget": "t","comment": "了解如何配置远程调试。有关详细信息,请参阅 http://aka.ms/vslinuxdebug","debuggerConfiguration": "gdb","MIMode": "lldb","gdbPath": "/usr/local/bin/lldb-mi","preDebugCommand": "echo","args": [],"env": {},"setupCommands": [{"text": "settings set target.disable-aslr 0"}]}]
}

至此,终于可以使用LLDB调试程序了。

如果想要在命令行中使用LLDB进行调试,可以创建一个~/.lldbinit文件,添加内容:

settings set target.disable-aslr 0

即LLDB启动时会自动执行里面的命令。

但VS中不行,VS是启动的lldb-mi,再启动的lldb-server

1.3 macOS配置

macOS的默认配置如下:

{"name": "macos-debug","displayName": "macOS Debug","generator": "Ninja","binaryDir": "${sourceDir}/out/build/${presetName}","installDir": "${sourceDir}/out/install/${presetName}","cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"},"condition": {"type": "equals","lhs": "${hostSystemName}","rhs": "Darwin"},"vendor": {"microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {"sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"}}
}

使用默认的macOS配置会有一点问题,就是找不到cmake,如果没安装ninja的话也会找不到ninja

在这里插入图片描述

VS在macOS系统应该是使用whereis来查找程序的,可以看到whereis是没有找到cmake的,而which是可以正确查到cmake程序的(VS为啥不在whereis没找到时再用which查找一下,或者直接优先使用which查找):

在这里插入图片描述

可以查看whereis的man手册,原来在macOS系统是使用sysctl命令获取的user.cs_path路径来查找程序的。

在这里插入图片描述

通过sysctl -a | grep user可以看到whereis的搜索路径为/usr/bin:/bin:/usr/sbin:/sbin,没有/usr/local/bin,所以找不到。

在这里插入图片描述

看到这里可能会想修改这个值,但是通过查看man sysctl发现这个值根本不能修改(为no的都不能修改):
在这里插入图片描述
这点与Linux不一样,Linux下的whereis以及which都是可以通过PATH路径搜索的。

可能会想到像Linux一样在/usr/bin下创建一个cmake的符号链接,由于MacOS系统/usr/bin不可修改,也不行。

只好修改cmake配置了:

{"name": "macos-debug","displayName": "macOS Debug","cmakeExecutable": "/usr/local/bin/cmake",  // 指定cmake的绝对路径"generator": "Unix Makefiles",              // 如果没安装Ninja就改为"Unix Makefiles""binaryDir": "${sourceDir}/out/build/${presetName}","installDir": "${sourceDir}/out/install/${presetName}","cacheVariables": {"CMAKE_BUILD_TYPE": "Debug"},"condition": {"type": "equals","lhs": "${hostSystemName}","rhs": "Darwin"},"vendor": {"microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {"sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"}}
}

此时开始调试程序还可能会遇到如下错误:
developer mode is not enabled on this machine and this is a non-interactive debug session

在这里插入图片描述
这是macOS系统还没打开开发者模式,使用下面的命令打开:

sudo DevToolsSecurity enable

2.不使用CMake预设配置文件

如果不使用预设配置文件,则变更本地计算机下拉列表中的连接时,不会自动变更后面的配置,即不会根据远程连接,自动变更配置。默认只有本地计算机x64-Debug配置。要想使用其它配置,需要手动添加,选择管理配置,就会创建一个CMakeSetings.json文件,并进入CMakeSetings.json的编辑界面(如果没有使用文本编辑器打开的话):

在这里插入图片描述

选择添加配置,则会弹出如下界面,可以选择使用GCC还是Clang的Debug或者Release配置:

在这里插入图片描述

远程计算机中可以指定远程连接,也可以使用${defaultRemoteMachineName},这样会使用连接管理器中选择的默认连接,即列表中标识为默认的连接:

在这里插入图片描述

前面选择是使用GCC还是Clang的时候如果选错了或者想更改,可以通过修改工具集来改变:

在这里插入图片描述

CMake生成器默认为Ninja,如果远程系统没安装则可以选择Unix Makefiles,IntelliSense模式默认是没有选择任何内容的,这里根据是64位系统还是32位系统选择linux-gcc-x64或者linux-gcc-x86

在这里插入图片描述

目前使用GCC工具集的智能提示不是很完善,比如boost库(笔者使用的1.82版本)中asio相关的的提示有问题,也不知道是GCC的问题还是VS的问题。推荐使用Clang工具集,Clang工具集没此问题。

写得非常详细,关于LLDB的部分是笔者的踩坑经历,希望对大家有帮助!

欢迎点赞,收藏。转载请注明出处!

相关文章:

Visual Studio 2022连接远程系统进行C/C++开发

Visual Studio被称为是宇宙最强IDE&#xff0c;以前开发Linux C/C服务器程序&#xff0c;基本上都是在Windows上使用VS编写跨平台的C/C代码&#xff0c;然后先在VS中编译、链接、调试&#xff0c;然后在Linux下编译、链接&#xff0c;再针对Linux下的特定代码进行调试。后面Vis…...

TiDB数据库从入门到精通系列之二:TiDB数据库的简介

TiDB数据库从入门到精通系列之二&#xff1a;TiDB数据库的简介 一、TiDB数据库的简介二、五大核心特性三、四大核心应用场景四、TiDB数据库与MySQL数据库的兼容性 一、TiDB数据库的简介 TiDB是开源分布式关系型数据库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (H…...

opencv视频截取每一帧并保存为图片python代码CV2实现练习

当涉及到视频处理时&#xff0c;Python中的OpenCV库提供了强大的功能&#xff0c;可以方便地从视频中截取每一帧并将其保存为图片。这是一个很有趣的练习&#xff0c;可以让你更深入地了解图像处理和多媒体操作。 使用OpenCV库&#xff0c;你可以轻松地读取视频文件&#xff0…...

虹科方案 | 汽车总线协议转换解决方案(二)

上期说到&#xff0c;虹科的PCAN-LIN网关在CAN、LIN总线转换方面有显著的作用&#xff0c;尤其是为BMS电池通信的测试提供了优秀的解决方案。假如您感兴趣&#xff0c;可以点击文末相关链接进行回顾&#xff01; 而今天&#xff0c;虹科将继续给大家带来Router系列在各个领域的…...

[Android] 通过JNI 让 JAVA 调用 android native 接口

前言&#xff1a; JNI (java native interface) 是一个库&#xff0c;可以让 java 代码和其他语言互动&#xff0c;比如 java 通过 JNI 调用融合了 jni库的 c/c 代码&#xff0c;注意&#xff0c;这里要求 c/c代码中必须通过链接 jni 库并按照 JNI 规范定义一套可供 JAVA 调用…...

MySQL高可用MHA

目录 前言 一、概述 二、配置免密、组从复制 三、MHA配置 四、测试 总结 前言 MySQL高可用管理工具&#xff08;MHA&#xff0c;Master High Availability&#xff09;是一个用于自动管理MySQL主从复制的工具&#xff0c;它可以提供高可用性和自动故障转移。MHA由原版的MHA工具…...

DoIP学习笔记系列:(五)“安全认证”的.dll从何而来?

文章目录 1. “安全认证”的.dll从何而来?1.1 .dll文件base1.2 增加客户需求算法传送门 DoIP学习笔记系列:导航篇 1. “安全认证”的.dll从何而来? 无论是用CANoe还是VFlash,亦或是编辑cdd文件,都需要加载一个与$27服务相关的.dll(Windows的动态库文件),这个文件是从哪…...

205、仿真-51单片机直流数字电流表多档位切换Proteus仿真设计(程序+Proteus仿真+原理图+流程图+元器件清单+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括&#xff1a; 方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源…...

服务器如何防止cc攻击

对于搭载网站运行的服务器来说&#xff0c;cc攻击应该并不陌生&#xff0c;特别是cc攻击的攻击门槛非常低&#xff0c;有个代理IP工具&#xff0c;有个cc攻击软件就可以轻易对任何网站发起攻击&#xff0c;那么服务器如何防止cc攻击?请看下面的介绍。 服务器如何防止cc攻击&a…...

解读注解@Value占位符替换过程

之前写过一篇关于介绍Spring占位符替换原理的博客&#xff0c;传送门 &#xff1a;Spring的占位符是怎么工作的 在这篇文章基础上&#xff0c;再介绍一下Value替换原理&#xff0c;两篇文章有一定的相关性。 继续以上一篇的工程为例&#xff0c;项目结构一样&#xff0c;这里就…...

浅谈5G技术会给视频监控行业带来的一些变革情况

5G是第五代移动通信技术&#xff0c;能够提供更高的带宽和更快的传输速度&#xff0c;这将为视频技术的发展带来大量机会。随着5G技术的逐步普及与商用&#xff0c;人们将能够享受到更加流畅的高清视频体验&#xff0c;并且5G技术还拥有更低的延迟和更高的网络容量。这些优势不…...

Java常用API---快速达到Java工作水准系列(1)

目录 1.集合 2.包装类 3.日期处理以及格式化 4.字符串处理类 5.数组 5.BigDecimal 6.Math 1.集合 毋庸置疑&#xff0c;集合在实际项目的使用概率几乎是百分之百。无论是用于数据存储和管理、去重和查找亦或是数据检索和遍历&#xff0c;都离不开集合的使用。任何一个项…...

Python中使用隧道爬虫ip提升数据爬取效率

作为专业爬虫程序员&#xff0c;我们经常面临需要爬取大量数据的任务。然而&#xff0c;有些网站可能会对频繁的请求进行限制&#xff0c;这就需要我们使用隧道爬虫ip来绕过这些限制&#xff0c;提高数据爬取效率。本文将分享如何在Python中使用隧道爬虫ip实现API请求与响应的技…...

深入源码分析kubernetes informer机制(四)DeltaFIFO

[阅读指南] 这是该系列第四篇 基于kubernetes 1.27 stage版本 为了方便阅读&#xff0c;后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 client-go中的存储结构DeltaFIFOdelta索引 keyqueue push操作delta push 去重 queue pop操作 总结 client-go中的存储结构…...

UI设计师个人工作总结范文

UI设计师个人工作总结范文篇一 感受到了领导们“海纳百川”的胸襟&#xff0c;感受到了作为广告人“不经历风雨&#xff0c;怎能见彩虹”的豪气&#xff0c;也体会到了重庆广告从业人员作为拓荒者的艰难和坚定(就目前国内广告业而言&#xff0c;我认为重庆广告业尚在发展阶段并…...

explicit关键字 和 static成员

explicit关键字 和 static成员 1、explicit 关键字2、static成员&#xff08;静态成员变量属于类的&#xff08;只有所属这个类的对象才能修改&#xff09;&#xff0c;不同于全局变量&#xff08;任何对象都能修改&#xff09;&#xff09;2.1 定义和性质2.2 静态成员的使用场…...

安装Linux操作系统CentOS 6详细图文步骤

为满足业务对Linux操作系统部署的要求&#xff0c;本文档主要提供CentOS 6操作系统的最小化安装和基本配置, 安装本系统建议最少1GB内存和2GB磁盘空间。 1、 使用光盘或者挂载ISO镜像&#xff0c;在出现如下图形界面时选择【Install or upgrade an existing system】并按Ent…...

新增守护进程管理、支持添加MySQL远程数据库,支持PHP版本切换,1Panel开源面板v1.5.0发布

2023年8月14日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.5.0版本。 在这个版本中&#xff0c;1Panel新增了守护进程管理功能&#xff1b;支持添加MySQL远程数据库&#xff1b;支持添加FTP/S和WebDAV的SFTP服务&#xff1b;支持PHP版本切换。此外&am…...

十、接口(1)

本章概要 抽象类和方法接口创建 默认方法多继承接口中的静态方法Instrument 作为接口 接口和抽象类提供了一种将接口与实现分离的更加结构化的方法。 这种机制在编程语言中不常见&#xff0c;例如 C 只对这种概念有间接的支持。而在 Java 中存在这些关键字&#xff0c;说明…...

percentile_approx 聚合函数

返回组内 expr 的百分位近似值。 此函数是 approx_percentile 聚合函数的同义词。 语法 percentile_approx ( [ALL | DISTINCT ] expr, percentile [, accuracy] ) [FILTER ( WHERE cond ) ] 还可以使用 OVER 子句将此函数作为窗口函数调用。 参数 expr&#xff1a;数值表达…...

RabbitMQ 的高可用性

RabbitMQ 是比较有代表性的&#xff0c;因为是基于主从&#xff08;非分布式&#xff09;做高可用的RabbitMQ 有三种模式&#xff1a;单机模式、普通集群模式、镜像集群模式。 单机模式 单机模式,生产几乎不用。 普通集群模式&#xff08;无高可用性&#xff09; 普通集群模…...

深入解析CI/CD开发流程

引言&#xff1a;主播最近实习的时候发现部门里面使用的是CI/CD这样的集成开发部署&#xff0c;但是自己不是太了解什么意思&#xff0c;所以就自己查了一下ci/cd相关的资料&#xff0c;整理分享了一下 一、CI/CD CI/CD是持续集成和持续交付部署的缩写&#xff0c;旨在简化并…...

怎么解决cesium加载模型太黑,程序崩溃,不显示,位置不对模型太大,Cesium加载gltf/glb模型后变暗

有时候咱们cesium加载模型时候型太黑&#xff0c;程序崩溃&#xff0c;不显示&#xff0c;位置不对模型太大怎么办 需要处理 可以联系Q:424081801 谢谢 需要处理 可以联系Q:424081801 谢谢...

模拟法解题的思路与算法分享

我们先来看思路与算法&#xff1a; 使用变长数组对栈进行模拟。 如果操作是 &#xff0c;那么访问数组的后两个得分&#xff0c;将两个得分之和加到总得分&#xff0c;并且将两个得分之和入栈。如果操作是 D&#xff0c;那么访问数组的最后一个得分&#xff0c;将得分乘以 2 …...

人工智能赋能高中学科教学的应用与前景研究

一、引言 1.1 研究背景 在科技飞速发展的当下&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称 AI&#xff09;已成为全球瞩目的关键技术领域&#xff0c;深刻地改变着人们的生活、工作和学习方式。从智能家居设备到智能交通系统&#xff0c;从医疗…...

一键更新依赖全指南:Flutter、Node.js、Kotlin、Java、Go、Python 等主流语言全覆盖

在现代软件开发中&#xff0c;依赖项扮演着至关重要的角色。保持依赖的最新状态不仅可以获得新特性和性能优化&#xff0c;还能修复已知安全漏洞。但在不同语言和框架中&#xff0c;依赖管理的方式差异很大。本篇文章将系统性讲解如何在各主流语言中实现“一键更新依赖”。 &am…...

HA: Wordy靶场

HA: Wordy 来自 <HA: Wordy ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.128&#xff0c;靶场IP192.168.23.130 3&#xff0c;对靶机进行端口服务探…...

Kafka 入门指南与一键部署

Kafka 介绍 想象一下你正在运营一个大型电商平台&#xff0c;每秒都有成千上万的用户浏览商品、下单、支付&#xff0c;同时后台系统还在记录用户行为、更新库存、处理物流信息。这些海量、持续产生的数据就像奔腾不息的河流&#xff0c;你需要一个强大、可靠且实时的系统来接…...

产品经理课程(十一)

&#xff08;一&#xff09;复习 1、用户需求不等于产品需求&#xff0c;挖掘用户的本质需求 2、功能设计的前提&#xff1a;不违背我们的产品的基础定位&#xff08;用一句话阐述我们的产品&#xff1a;工具&#xff1a;产品画布&#xff09; 3、判断设计好坏的标准&#xf…...

1130 - Host ‘xxx.x.xx.xxx‘is not allowed to connect to this MySQL server

以下为本次问题的解决办法&#xff1a; 1、暂停mysql容器&#xff1a; docker stop mysql 2、删除mysql容器&#xff1a;docker rm mysql 3、查看mysql容器是否被删除&#xff1a;docker ps -a #没有mysql容器就是删除成功 4、run mysql容器&#xff1a; docker run -d --…...