Linux系统下基于VSCode和Cmake进行C++开发

目录

  • 简介
  • 一、GCC编译器
    • 1.1创建cpp文件
    • 1.2编译过程
    • 1.3g++重要编译参数
  • 二、GDB调试器
  • 三、IDE-VScode
    • 3.1 VSCode常用快捷键
    • 3.2 swap测试
  • 四、CMake
    • 4.1CMake介绍
    • 4.2 CMake语法特性介绍
    • 4.3 CMake重要指令和常用变量
    • 4.4 CMake编译流程
    • 4.5CMake代码实践
  • 五、使用VSCode进行完整项目开发【实战】
    • 5.1 launch.json和task.json配置
  • 六、总结

简介

在 Linux 系统中,使用 Visual Studio Code (VSCode) 和 CMake 进行 C++ 开发是十分方便的。以下是整个工作流的简介:

  • VSCode 是由微软出品的一款轻量级、高度可扩展的代码编辑器,它支持几乎所有的主流编程语言,可以在多种操作系统(包括 Linux)上运行。

  • CMake 是一个开源的跨平台自动化建构系统,它用于控制编译过程,使其在多个平台上能够相同。在 VSCode 中,我们使用“CMake Tools”插件来调用和使用 CMake。

  • 在进行 C++ 开发时,首先在 VSCode 中创建一个新的工作区,并在其中创建源代码文件 .cpp 和你的 CMakeLists.txt 文件。CMakeLists.txt 是 CMake 的配置文件,其中定义了项目的编译和链接规则

  • 安装并配置好 CMake Tools 插件后,你可以选择 CMake Kit(对应你的编译器),并设置你的构建类型(例如 Debug 或 Release)。

  • 接下来,你可以使用 VSCode 的内置终端运行 CMake 命令,这将触发 CMake 对项目的编译。在编译完成后,你可以直接在 VSCode 中运行和调试你的应用。

通过 CMake 和 VSCode,你可以轻松地在 Linux 上进行 C++ 的编写、编译、运行和调试。并且,由于 CMake 具有良好的平台兼容性,你的代码可以很容易地在其它系统(如 windows,macOS)上重新编译和运行

这种开发方式允许你专注于代码的编写,而将复杂的编译和链接过程由 CMake 自动化处理。同时,VSCode 提供的丰富插件也可以大大提高你的开发效率。

一、GCC编译器

1.1创建cpp文件

使用vim编辑器创建一个cpp文件:

lg@lg-virtual-machine:~/cmake_class/0310$ vim test.cpp
#include<iostream>
using namespace std;int main(){cout<<"hh"<<endl;return 0;
}

使用如下命令保存cpp文件并退出:

:wq

1.2编译过程

将cpp代码编译为机器语言的目标二进制代码 .o文件 ,并指定一个可执行文件的文件名:

lg@lg-virtual-machine:~/cmake_class/0310$ g++ test.cpp -o test
lg@lg-virtual-machine:~/cmake_class/0310$ ./test 
hh

1.3g++重要编译参数

  • -g 编译带调试信息的可执行文件
# -g 选项告诉 GCC 产生能被 GNU 调试器GDB使用的调试信息,以调试程序。
# 产生带调试信息的可执行文件test
g++ -g test.cpp
  • -O[n] 优化源代码
 ## 所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作
会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。
# -O 选项告诉 g++ 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。 -O2 
选项告诉 g++ 产生尽可能小和尽可能快的代码。 如-O2,-O3,-On(n 常为03)
# -O 同时减小代码的长度和执行时间,其效果等价于-O1
# -O0 表示不做优化
# -O1 为默认优化
# -O2 除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等。
# -O3 则包括循环展开和其他一些与处理特性相关的优化工作。
# 选项将使编译的速度比使用 -O 时慢, 但通常产生的代码执行速度会更快。
# 使用 -O2优化源代码,并输出可执行文件
g++ -O2 test.cpp
  • -l 和 -L 指定库文件 | 指定库文件路径
# -l参数(小写)就是用来指定程序要链接的库,-l参数紧接着就是库名
# 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接
# 链接glog库
g++ -lglog test.cpp
# 如果库文件没放在上面三个目录里,需要使用-L参数(大写)指定库文件所在目录
# -L参数跟着的是库文件所在的目录名
# 链接mytest库,libmytest.so在/home/bing/mytestlibfolder目录下
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp

二、GDB调试器

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。你可以使用GDB调试各种被编译成可执行程序的语言,如C、C++、Java等。它提供了很多高级功能,例如设置断点、查看程序变量、单步执行等。
下面是一些基础的GDB命令:

  • gdb program:打开你的程序
  • run:运行你的程序
  • break:在特定的位置设置一个断点
  • step:执行下一行代码,如果下一行是一个函数调用,那么进入到这个函数中
  • next:执行下一行代码,不进入函数
  • print:打印变量的值
  • continue:继续执行程序,直到下一个断点或者程序结束
  • quit:退出GDB

为了使用GDB,在编译你的程序时,需要包含-g选项来生成额外的调试信息。

在GDB调试程序时,你可以设置断点来暂停程序的执行,观察和改变变量的值,然后继续执行,这对于查找和理解程序问题是十分有用的。

三、IDE-VScode

3.1 VSCode常用快捷键

Visual Studio Code(VSCode)是一款非常流行的开源文本编辑器,它支持多种编程语言,并且拥有许多可以提高编程效率的快捷键。这里将列举一些常用的VSCode快捷键:

  • Ctrl + \:分屏显示
  • Ctrl + P:快速打开文件
  • Ctrl + Shift + P:显示所有命令
  • Ctrl + B:隐藏或显示侧边栏
  • Ctrl + Shift + E:显示资源管理器 / 切换焦点到侧边栏
  • Ctrl + G:跳转到指定行数
  • Ctrl + F:当前文件内搜索
  • Ctrl + H:当前文件内搜索并替换
  • Ctrl + D:选取单词 - 可逐个添加相同的单词进行多项选择
  • Ctrl + Shift + L:选择所有出现在当前文件中的相同的词
  • Alt + Up 或 Alt + Down:上移或下移一行
  • Shift + Alt + Up 或 Shift + Alt + Down:向上或向下复制一行
  • Ctrl + Space:代码建议(代码补全)
  • F12:进入定义
  • Alt + F12:显示定义预览眼睛
  • Ctrl + Shift + F:全局搜寻文件内容
  • Ctrl + ~:打开或关闭终端
  • Ctrl + S:保存当前文件
  • Ctrl + /:注释或取消注释
  • Alt + Z:自动换行
  • Ctrl + Shift + I:格式化文档

VSCode的快捷键可以在键盘快捷方式设置中进行自定义,快捷键有助于我们更加有效率的进行编程工作。

3.2 swap测试

首先新建一个文件夹,然后点击进入该文件夹:
在这里插入图片描述
在该文件夹目录下打开VSCode:
在这里插入图片描述
进入VSCode之后,再新建include和src两个文件夹,分别用来存放头文件和源文件,最后新建一个主函数文件main.cpp:
在这里插入图片描述
代码如下:

  • swap.h:
#pragma once
#include <iostream>
using namespace std;class myswap
{
public:myswap(int a, int b);void run();void printInfo();private:int _a;int _b;
};
  • swap.cpp:
#include "swap.h"
myswap::myswap(int a, int b)
{this->_a = a;this->_b = b;
}
void myswap::run()
{int temp = _a;_a = _b;_b = temp;
}
void myswap::printInfo()
{cout << "a  =" << _a << "b = " << _b << endl;
}
  • main.cpp:
#include "swap.h"
int main(int argc, char *argv[])
{myswap test(2, 3);test.run();test.printInfo();return 0;
}

最后打开终端(Ctrl+~)编译并运行:

lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass$ g++ main.cpp src/swap.cc -Iinclude -o main
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass$ ./main 
a  =3b = 2
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass$ 

四、CMake

4.1CMake介绍

CMake是一种开源的、跨平台的自动化构建系统,它用来控制软件编译过程,使得源代码与目标系统的编译过程可以分离出来。

CMake可以支持目录层次和应用程序,允许开发者在一个源代码目录树中存放不同的构建配置文件。当你的源代码由很多个不同的项目组成,每个项目都有自己的构建配置时,就可以非常洁净地采用CMake来管理。

CMake可以在一个目录里存在多个独立的构建环境,每个环境都有属于自己的构建配置。有了CMake,就可以在同一个目录里同时配备Debug版和Release版的应用程序。

CMake有许多语言的扩展阅读,例如:C,C++,Fortran,Java等,使得CMake在不同的系统和不同的编译环境下,生成适应的、原生的Makefile或项目文件,如Unix的Makefile,Visual Studio的工程文件等。

CMake的语法非常简单,大部分可用的指令和变量在CMake全局帮助文档中都有所介绍。其主要配置文件命名为CMakeLists.txt,在该文件中,你可以设置项目名称、版本、相关的环境参数等。

4.2 CMake语法特性介绍

CMake的语法相对来说比较简单,主要包括以下几种结构:

  • 1、设置变量:你可以使用set命令来设置一个变量,例如:
set(SOURCE_FILES main.cpp test.cpp)

这段代码定义了一个名为SOURCE_FILES的变量,它包含了两个文件:main.cpp和test.cpp。

  • 2、控制流语句:CMake提供了常见的条件判断和循环语句,例如if,elseif, else, endif, while,endforeach等。
if (${VARIABLE} STREQUAL "test")message("VARIABLE is test")
else()message("VARIABLE is not test")
endif()

这段代码会检查VARIABLE变量是否等于"test",然后输出相应的消息。

  • 3、包含和添加子目录:include和add_subdirectory命令可以用于组织你的CMakeLists.txt文件,让你的项目结构更清晰。

通过include(FileName),你可以把FileName文件里的内容插入到当前的CMake脚本文件中。
通过add_subdirectory(SubDirName),在生成构建系统的时候可以在子目录系中添加CMake的列表文件。

添加目标:使用add_executable、add_library等命令定义你的构建目标。

add_executable(MyApp main.cpp) 定义一个可执行目标,名为MyApp,源文件是main.cpp。
链接库:使用target_link_libraries命令链接库。

target_link_libraries(MyApp MyLibrary)

这段代码会让MyApp链接到MyLibrary库。

以上为CMake的基本语法,实际使用中,需要根据具体的项目需求,用更多的命令和更复杂的语句来编写你的CMakeLists.txt文件。

4.3 CMake重要指令和常用变量

CMake主要包括一下几个重要指令:

  • 1、cmake_minimum_required:设置对CMake版本的最低版本要求,如果不满足该版本,报告用户错误。例如:
cmake_minimum_required(VERSION 2.8.3)
  • 2、project:定义项目名称和支持的编程语言。例如:
project(HELLO C CXX)
  • 3、set:设置变量的值。例如:
set(SRC_LIST main.cpp test.cpp)
  • 4、message:输出消息,通常用于调试CMakeLists.txt文件。例如:
message(${SRC_LIST})
  • 5、add_executable:添加需要编译的可执行文件。例如:
add_executable(myapp ${SRC_LIST})
  • 6、add_library:添加库的构建命令,库源码由src2和src3命令生成。例如:
add_library(test SHARED src2.cpp src3.cpp)
  • 7、target_link_libraries:为目标添加需要的链接库。例如:
target_link_libraries(myapp test)
  • 8、find_package:用于加载配置文件,以便CMake使用。例如:
find_package(Qt5Core)
  • 9、include_directories:添加包含目录,相当于C++中的-I选项。例如:
include_directories("/usr/include/mylib")
  • 10、add_definitions:添加编译的定义,相当于C++中的-D选项。例如:
add_definitions("-DMY_DEFINE")

注意,CMake指令是不区分大小写的,你可以根据需要选择使用大写或者小写。

4.4 CMake编译流程

CMake的编译流程主要包括以下几个步骤:

  1. 编写CMakeLists.txt文件:在你的项目主目录中,编写CMakeLists.txt文件,这个文件描述了你的项目如何构建。包括指定最小版本号,指定项目名称,查找依赖库,添加子目录,添加头文件目录,添加预编译宏,生成可执行文件,添加链接库等。

  2. 生成Makefile:在命令行中切到你的项目目录,然后执行’cmake .'。这会让CMake读取CMakeLists.txt文件,并产生在你的系统上编译代码所需的Makefile文件。如果是在windows上,并且安装了Visual Studio,那么CMake还能生成.sln工程文件。

  3. 编译项目:使用’cmake --build .‘或’make’(Unix/Linux)或’msbuild myproject.sln’(Windows),编译上一步生成的Makefile。

这里的’.'是指当前目录,等同于源代码目录(build in source)。实际上,在项目中,我们经常会新建一个build目录,然后在这个目录下运行cmake. .和make,这会把所有编译生成的文件都放在这个子目录,而源码目录下只保存源码文件,这样可以使源码目录干净整洁。这种方式称为out of source构建。

注意:在使用cmake生成Makefile之后,如果修改了CMakeLists.txt或者添加了新的.cpp/.h文件,必须重新执行cmake一遍才会生效。

4.5CMake代码实践

查看cmake版本:

lg@lg-virtual-machine:~$ cmake --version 
cmake version 3.16.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).

编写CMakeLists.txt:

cmake_minimum_required(VERSION 3.16.3)project(SWAP)set(CMAKE_BUILD_TYPE Debug)//设置cmake构建类型为debug模式include_directories(include)//头文件add_executable(swapmain_cmake main.cpp src/swap.cc)//可执行的二进制文件名  , 源文件

新建一个build文件夹用来存放cmake编译产生的文件:

lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass$ mkdir build
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass$ cd build/
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass/build$ cmake ..
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass/build$ make
Scanning dependencies of target swapmain_cmake
[ 33%] Building CXX object CMakeFiles/swapmain_cmake.dir/main.cpp.o
[ 66%] Building CXX object CMakeFiles/swapmain_cmake.dir/src/swap.cc.o
[100%] Linking CXX executable swapmain_cmake
[100%] Built target swapmain_cmake
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass/build$ ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  Makefile  swapmain_cmake
lg@lg-virtual-machine:~/cmake_class/0310/swapwithclass/build$ ./swapmain_cmake 
a  =3b = 2

五、使用VSCode进行完整项目开发【实战】

如何进行cpp项目的编译和运行在之前已经讲过,在这一章主要讲如何使用GDB调试器进行程序的debug。

5.1 launch.json和task.json配置

参考资料:VScode 调试教程 tasks.json和launch.json的设置(超详细)
launch.json和tasks.json都是Visual Studio Code编辑器的配置文件,主要用于启动和管理你项目的构建以及调试任务。配置好这两个文件之后,不需要在终端使用命令行去一步步编译和运行,比如cmake、make、./main等命令,可以直接打断点运行调试。

  • launch.json:该文件是Visual Studio Code用来配置和管理调试会话的。在这个文件中,你可以定制多种启动调试程序的配置,包括调试脚本的路径,启动参数,环境变量等等。每一个对象代表一个独立的调试配置。通过这个文件,你可以实现多种调试环境的切换和管理。
{// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "(gdb) 启动","type": "cppdbg","request": "launch","program": "${workspaceFolder}/build/main","args": [], "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": "Build","miDebuggerPath": "/usr/bin/gdb"}]
}
  • tasks.json:该文件用于配置Visual Studio Code自动化工作流程,如编译,测试,部署等任务。用户可以通过个性化配置的方式来设定任务运行的条件,如何运行,以及运行的产出结果。
{   "version": "2.0.0","options": {"cwd": "${workspaceFolder}/build"},"tasks": [{"type": "shell","label": "cmake","command": "cmake","args": [".."]},{"label": "make","group": {"kind": "build","isDefault": true},"command": "make","args": []},{"label": "Build","dependsOrder": "sequence", // 按列出的顺序执行任务依赖项"dependsOn":["cmake","make"]}]
}

在这里插入图片描述
需要一样的地方
在这里插入图片描述
在这里插入图片描述

六、总结

在以后实际工作中,使用VSCode进行项目的开发,进行上面的步骤是比不可少的。本文,我们主要学会了以下几点:

  • 1、cpp工程怎么新建?
  • 2、如何使用GCC编译器和GDB调试器
  • 3、如何使用CMake?
  • 4、如何配置vscode怎么单步调试
    熟能生巧!保持进步!细心、耐心、坚持!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaScript】面试手撕柯里化函数

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 引入柯里化定义实现快速使用柯里化的作用提高自由度bind函数 参考资料 引入 上周…

开源绘图工具 PlantUML 入门教程(常用于画类图、用例图、时序图等)

文章目录 一、类图二、用例图三、时序图 一、类图 类的UML图示 startuml skinparam classAttributeIconSize 0 class Dummy {-field1 : String#field2 : int~method1() : Stringmethod2() : void } enduml定义能见度&#xff08;可访问性&#xff09; startumlclass Dummy {-f…

ES6(一):let和const、模板字符串、函数默认值、剩余参数、扩展运算符、箭头函数

一、let和const声明变量 1.let没有变量提升&#xff0c;把let放下面打印不出来&#xff0c;放上面可以 <script>console.log(a);let a1;</script> 2.let是一个块级作用域,花括号里面声明的变量外面找不到 <script>console.log(b);if(true){let b1;}//und…

vscode插件开发-发布插件

安装vsce vsce是“Visual Studio Code Extensions”的缩写&#xff0c;是一个用于打包、发布和管理VS Code扩展的命令行工具。 确保您安装了Node.js。然后运行&#xff1a; npm install -g vscode/vsce 您可以使用vsce轻松打包和发布扩展&#xff1a; // 打包插件生成name…

一.java介绍和idea基础使用

java技术体系 Java技术体系说明Java SE(Java standard Edition):标准版Java技术的核心和基础Java EE(Java Enterprise Edition):企业版企业级应用开发的一套解决方案Java ME(Java Micro Edition):小型版针对移动设备应用的解决方案&#xff08;认可少&#xff0c;主要是安卓和…

目标跟踪SORT算法原理浅析

SORT算法 Simple Online and Realtime Tracking(SORT)是一个非常简单、有效、实用的多目标跟踪算法。在SORT中&#xff0c;仅仅通过IOU来进行匹配虽然速度非常快&#xff0c;但是ID switch依然非常严重。 SORT最大特点是基于Faster RCNN的目标检测方法&#xff0c;并利用卡尔…

Unity开发中Partial 详细使用案例

文章目录 **1. 分割大型类****2. 与 Unity 自动生成代码协同工作****3. 团队协作****4. 共享通用逻辑****5. 自定义编辑器相关代码****6. 配合 Unity 的 ScriptableObjects 使用****7. 多人协作与版本控制系统友好** 在 Unity 开发中&#xff0c; partial 关键字是 C# 语言提供…

【音视频开发】:RTSP服务器协议内容

一、什么是RTSP协议 RTSP是一个实时传输流协议&#xff0c;是一个应用层的协议。通常说的RTSP包括RTSP协议、RTP协议、RTCP协议。 RTSP协议&#xff1a;负责服务器与客户端之间的请求与相应RTP协议 &#xff1a;负责服务器与客户端之间传输媒体数据RTCP协议&#xff1a;负责提…

使用html+css制作一个发光立方体特效

使用htmlcss制作一个发光立方体特效 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Documen…

Acwing.4261 孤独的照片(贡献法)

题目 Farmer John 最近购入了 N 头新的奶牛&#xff0c;每头奶牛的品种是更赛牛&#xff08;Guernsey&#xff09;或荷斯坦牛&#xff08;Holstein&#xff09;之一。 奶牛目前排成一排&#xff0c;Farmer John 想要为每个连续不少于三头奶牛的序列拍摄一张照片。 然而&…

视觉信息处理与FPGA实现第三次作业-7人表决器

一、模块端口图 二、代码 timescale 1ns / 1nsmodule vote_7(person1,person2,person3,person4,person5,person6,person7,out); input person1,person2,person3,person4,person5,person6,person7 ; output out ; assi…

mac激活pycharm,python环境安装和包安装问题

1.PyCharm到官网下载就行 地址&#xff1a;Other Versions - PyCharm (jetbrains.com) 2.MacOS 下载python环境&#xff0c;地址&#xff1a; Python Releases for macOS | Python.org 3.PyCharm环境配置&#xff1a; 4. 如果包下载不下来可以换个源试试 pip install py…

在Linux/Ubuntu/Debian中使用windows应用程序/软件

Wine 是一个兼容层&#xff0c;允许你在类 Unix 操作系统&#xff08;包括 Ubuntu&#xff09;上运行 Windows 应用程序。 以下是在 Ubuntu 上安装和使用 Wine 的基本步骤&#xff1a; 在 Ubuntu 上安装 Wine&#xff1a; 更新软件包列表&#xff1a; 打开终端并运行以下命令以…

苹果电脑下载crossover对电脑有影响吗 crossover mac 好用吗CrossOver虚拟机 CrossOver打游戏

苹果电脑下载crossover对电脑有影响吗&#xff1f; 在苹果电脑下载安装crossover对电脑没有什么影响&#xff0c;并且可以解决macOS系统不能安装Windows应用程序的问题。相较于虚拟机和双系统而言&#xff0c;crossover安装软件更简单&#xff0c;占用内存也更小。下面我们来看…

Django框架的全面指南:从入门到高级【第128篇—Django框架】

Django框架的全面指南&#xff1a;从入门到高级 Django是一个高效、功能强大的Python Web框架&#xff0c;它被广泛用于构建各种规模的Web应用程序。无论是初学者还是有经验的开发人员&#xff0c;都可以从入门到掌握Django的高级技巧。在本指南中&#xff0c;我们将带你逐步了…

云原生消息流系统 Apache RocketMQ 在腾讯云的大规模生产实践

导语 随着云计算技术的日益成熟&#xff0c;云原生应用已逐渐成为企业数字化转型的核心驱动力。在这一大背景下&#xff0c;高效、稳定、可扩展的消息流系统显得尤为重要。腾讯云高级开发工程师李伟先生&#xff0c;凭借其深厚的技术功底和丰富的实战经验&#xff0c;为我们带…

计算机网络-第4章 网络层(2)

主要内容&#xff1a;网络层提供的两种服务&#xff1a;虚电路和数据报&#xff08;前者不用&#xff09;、ip协议、网际控制报文协议ICMP、路由选择协议&#xff08;内部网关和外部网关&#xff09;、IPv6,IP多播&#xff0c;虚拟专用网、网络地址转换NAT&#xff0c;多协议标…

爬虫 配置charles

1,安装charles(青花瓷) 网上有很多资源这里我也传不上去 2,配置代理 访问控制 监听端口 证书 安装过程&#xff1a;点击help --》SSL proxying --》install charles root certificate --》安装证书 --》选择本地计算机 --》点下一步 --》选择将所有的证书都放入下列存储 -- 》…

java拷贝数组

package com.mohuanan.exercise;public class Exercise {public static void main(String[] args) {int[] arr {1, 2, 3, 4, 5, 6, 7, 8, 8}; //格式化快捷键 CTRL 加 Alt 加 L键// F1截图 F3贴图//调用 copyOfRangeint[] ints copyOfRange(arr, 3, 7);for (int i 0; i &l…

Monitor.TryEnter使用避坑

创建线程的函数 internal class MultiThread {/// <summary>/// 线程的工作函数类型/// </summary>public delegate void WorkProc();/// <summary>/// 创建进程的函数/// </summary>/// <param name"work">进程要执行的函数</par…