Ubuntu 22.04: VS Code 配置 C++ 编译及 CMake

news2024/11/14 22:06:30

一、VS Code 安装以及 C++ 编译环境配置

1. 在 Ubuntu 中安装 VS Code

笔者直接在 Ubuntu Software 中心安装 VS Code。也可以从VS Code官网下载 deb,解压 dpkg -i 安装。

2. VS Code 中配置 g++/gcc 

1) 安装 C/C++ 扩展 (Ctrl+Shift+X)

2)VS Code 要编译C++, 需安装g++编译器。GCC 代表 GNU 编译器集合,GDB 是 GNU 调试器。

控制台中运行命令:

    sudo apt-get update    


    gcc -v    #检查一下是否已安装gcc
    sudo apt install gcc  #安装gcc

    gdb -v  #检查一下是否已经安装gdb
    sudo apt-get install build-essential gdb    #安装gdb

3)验证是否安装成功:

whereis g++
whereis gdb

3. 建立单个cpp文件测试工程

1)测试文件夹内,创建cpp文件

touch hello.cpp

2)VS Code 中 File - OpenFolder, 打开cpp所在文件夹;或在cpp文件所在文件夹中,运行 “code . ”,打开 VS Code。这个目录就是你的工作空间。

注:用 VS Code 打开文件夹,而不是仅仅打开cpp文件。VS Code是基于文件夹运行的(配置好环境后会在同目录下生成.vscode文件,里面是我们的配置文件,以后只把这个文件夹拷贝并改动就可以实现在不同的机器上运行 VS Code 来编译C/C++程序)。

cd $HOME/projects/test_cpp
code .

3)编辑 hello.cpp 文件:

#include <stdio.h>
#include <iostream>

using namespace std;

int main()
{
    cout << "hello world!" << endl;
}

4. 调试 C++ 所需 json 配置文件

VS Code 只是一个文本编辑器,并不是一个完整的IDE,此时还不能直接点击运行按钮执行代码,需要通过其他插件来进行编译、运行。

需要增加两个配置文件,这两个配置文件在 .vscode 目录下面。当点击运行时,一般会在当前文件夹(工作空间)中自动生成.vscode文件夹,包含launch.json和tasks.json两个文件。如果没有自动生成的话,这些文件均可以自己手动创建。作用分别如下:
1) lauch.json负责启动任务,执行文件(可执行文件)。
2) tasks.json负责编译链接生成可执行文件,其实就是执行终端的编译指令[g++ -g main.cpp -o main.o]。所以在执行launch.json文件之前必须先执行tasks.json。
3) launch.json和tasks.json通过launch.json中的preLaunchTask关联起来。launch.json中的preLaunchTask是为了启动tasks.json的,所以preLaunchTask对应的标签应该与task.json一致。

1. 配置 tasks.json

1)打开 hello.cpp 文件,使其成为活动文件

2)点击右上角运行三角按钮,选 g++ 生成和调试活动文件(g++ build and debug active file)

3)此时在.vscode文件夹下,会产生类似如下 tasks.json文件:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file", //在任务列表中看到的内容,可以任意命名
            "command": "/usr/bin/g++",  // 指定要运行的程序(命令),即 g++

            // 此任务告诉 g++ 获取活动文件
            // 对其进行编译,然后在当前目录中创建一个与活动文件同名
            // 但没有扩展名的可执行文件
            // 其实该部分参数就是g++编译器对应的参数设置
            "args": [  // g++ hello.cpp -o hello
                "-fdiagnostics-color=always",
                "-g",
                "${file}", //要编译的cpp文件,可改为"${workspaceFolder}/*.cpp",则编译所有cpp文件
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}" // 输出名字
	            // "-std=c++11",   //使用c++11
	            // "-lpthread"       //链接thread库
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger." // 在任务列表中对任务进行描述,建议重命名此值,以将其与类似任务区分开来。
        }
    ],
    "version": "2.0.0"
}

    ${workspaceRoot} 当前打开的文件夹的绝对路径+文件夹的名字

    &{workspaceFolder}当前程序的路径,.vscode路径

    ${file}当前打开正在编辑的文件名,包括绝对路径,文件名,文件后缀名
    
    ${fileBasename}  当前打开的文件名+后缀名,不包括路径
    
    ${fileBasenameNoExtension} 当前打开的文件的文件名,不包括路径和后缀名
    
    ${fileDirname} 当前打开的文件所在的绝对路径,不包括文件名
    
    ${fileExtname} 当前打开的文件的后缀名

一般在第一次执行“Run” 操作的时候,会自动生成tasks.json。使用快捷键 ctrl+shift+P 打开搜索框,输入>tasks,选择配置任务,使用模板文件创建tasks.json,选择others。也可以生成tasks.json:

2. 配置 launch.json

1)返回 hello.cpp 文件,使其成为活动文件

2)点击右上角按钮“add debug configrations”,选择 “C/C++:g++ 生成和调试活动文件

3).vscode 文件夹下生成 launch.json,文件如下:

{
    "configurations": [
        {
            "name": "C/C++: g++ build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}", //指定要调试的程序
            "args": [], // 程序运行时,传递给程序的参数!比如:["./ubuntu.png"]
            "stopAtEntry": false, //目标开头处是否停止,一般false
            "cwd": "${fileDirname}", //目标的工作目录,相当于在终端里哪个路径位置,运行的程序
            "environment": [],
            "externalConsole": false, //是否在外部终端显示输出
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb", //为gdb启用整齐打印
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel", //将反汇编风格设置为Intel
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++ build active file",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ],
    "version": "2.0.0"
}

此时 hello.cpp 文件,右上角run和debug均可正常执行。

3. C/C++ 配置 c_cpp_properties.json

如果想要更好控制 C/C++ extension,可以创建c_cpp_properties.json文件,去更改编译路径、头文件路径、C++标准等设置。

Ctrl+Shift+P,输入 C/C++: Edit Configurations

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [  //头文件路径
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",  //编译器路径
            "cStandard": "c17",  // c标准
            "cppStandard": "c++98", // c++标准
            "intelliSenseMode": "linux-gcc-x64"
    	    // // "compileCommands": "${workspaceFolder}/build/compile_commands.json" //这一句命令一般用不上,因为有browse
	        // "browse": { //一般别用该参数,不需要,且易出错
	        //     "path": ["${workspaceFolder}"],
	        //     "limitSymbolsToIncludedHeaders": true, //一般设置为true,如果有些代码没法智能提示可以将该字段设置为false试试
	        //     "databaseFilename": "" 
	        // }
        }
    ],
    "version": 4
}

 如有报错,可尝试把"compileCommands"注释掉。

二、使用 CMake 建立多文件项目

1.安装CMake 

可参考  “3. 安装 Openssl 3.3.0, Boost, CMake” 部分

2. 使用CMake创建项目

为什么要使用CMake?理论上说,任意一个C++程序都可以用g++来编译。但当程序规模越来越大时,一个工程可能有许多个文件夹和源文件,这时输入的编译命令将越来越长。通常一个小型C++项目可能含有十几个类,各类间还存在着复杂的依赖关系。其中一部分要编译成可执行文件,另一部分要编译成库文件。如果仅靠g++命令,我们需要输入大量的编译指令,整个编译过程会变得异常繁琐。因此,对于C++项目,使用一些工程管理工具会更加高效。历史上工程师们曾使用makefile进行自动编译,cmake可以生成makefile文件。
在一个cmake工程中,用cmake命令生成一个makefile文件,然后用make命令根据这个makefile文件的内容编译整个工程。

使用CMake创建项目有两种方法:直接手动构建CMakeList;在VS code中通过插件生成CMakeList,然后在此基础上修改。

2.1 手动构建CMakeList,命令行运行cmake

编写一个求两数之和的程序项目,输入两个数a、b,可得到两数求和之后的结果c=a+b。

(1) 准备程序文件

终端运行

	mkdir cmakelist_test // 建立自己的项目文件夹
	cd cmakelist_test  
	mkdir build  //创建build文件夹(工作空间),也可以在VS code界面创建
	mkdir include   //创建include文件夹(工作空间),也可以在VS code界面创建
	mkdir src     //创建src文件夹(工作空间),也可以在VS code界面创建
	touch CMakeLists.txt    
	code . //用VS code打开以便于编辑

下面是比较通用的CMake目录结构,用include文件夹管理.h头文件,用.src文件夹管理.cpp源文件,在.build文件夹内完成一系列的编译工作,这样cmake生成的中间文件都在build目录,不会“污染”开发目录(将 build 目录加入 .gitignorej 即可忽略 CMake 所产生的所有中间文件),在编译出问题的时候也可以直接删除 build 目录重新编译。

├── build
├── CMakeLists.txt
├── include
 │ ├── Sum.h
├── src
 │ ├── Sum.cpp

 │ ├── main.cpp

  Sum.h文件

// sum.h
#ifndef SUM_H
#define SUM_H

int add(int a, int b);

#endif // SUM_H

  Sum.cpp文件

	int add(int x,int y)
	{
	    int z=0;
	    z=x+y;
	    return (z);
	}

main.cpp文件

	#include "Sum.h"	
    #include <stdio.h>
	#include <iostream>

	using namespace std;

	int main()
	{
	    int a=0, b=0, c=0;
	
	    //------c语言模式,不需要使用库iostream-------
	    //printf("please input two paramerer: ")
	    //scanf("%d", &a)
	    //scanf("%d", &b)
	    //c = add(a,b);
	    //printf("the sum is: %d", c)
	
	    //------ c++模式,需要使用库iostream----------
	    cout<<"please input two paramerer: "<<endl;
	    cin>> a >> b;
	    c = add(a,b);
	    cout<<"the sum is: "<< c <<endl;
	
	    return 0;
	}

 (2)编写CMakeLists.txt文件

在和src,include的同级目录创建CMakeLists.txt文件。实际放在哪里都可以,只要里面编写的路径能够正确指向就好了,一般范式是放在和src,include的同级目录。

CMakeLists.txt文件如下:

	#1.cmake verson,指定cmake版本
	cmake_minimum_required(VERSION 3.2)
	
	#2.project name,指定项目的名称,一般和项目的文件夹名称对应,声明一个cmake工程,工程名为cmakelist_test
	PROJECT(cmakelist_test)
	# #也可以写上项目的版本号,如下所示
	# project(cmakelist_test VERSION 0.1.0)
	
	#3.添加c++ 11标准支持,如果程序中使用了C++11标准,则需要设置告诉编译器,没有可以不用写。
	set( CMAKE_CXX_FLAGS "-std=c++11")
	
	#4.设置编译器编译模式,对于编译用的Debug模式和调试用的Release模式,在Debug模式中,程序运行较慢,当可以在IDE中进行断点调试,而Release模式则速度较快,但没有调试信息。不设置默认是Debug模式。
	set( CMAKE_BUILD_TYPE "Debug")
	
	#5.添加引用的第三方头文件,此项目main.cpp引用的头文件有Sum.h,因此需要添加头文件目录,因为和CMakeList.txt同级,所以此处目录只写include即可,应写对头文件所在的目录,以防找不到相应的头文件而报错,如果难以确定就直接写上绝对路径即可
	include_directories(include)    #其实头文件也可以放在源文件所在的文件夹中,这样就不用添加此命令,但是为了整个工程的简洁干净便于管理,所以建议放到include文件夹中。
	# #也可以将include_directories全部大写,如下所示,是一样的表达,其他的类似,也是可以全部大写表示的,例如add_executable写成ADD_EXECUTABLE
	# INCLUDE_DIRECTORIES(include)
	
	
	# #------------------------src下面有多个.cpp需要编译,相应的库函数也都有,这个时候可以执行下面的步骤------------------------------------
	# #6.source directory,源文件目录,将源文件目录/路径 src赋值给DIR_SRCS
	# AUX_SOURCE_DIRECTORY(src DIR_SRCS)
	# #7.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
	# SET(TEST_MATH ${DIR_SRCS}) #将编译用的源文件所在路径DIR_SRCS赋值给TEST_MATH
	# # #8.编译生成库文件,将Sum.cpp生成共享库文件libSum.so,这条命令告诉cmake,把这些源文件编译成一个叫作“Sum”的共享库,其实有了6和7没有必要再执行这一步
	# # add_library(Sum SHARED src/xxx1.cpp src/xxx2.cpp ...)
	# #9.add executable file,添加要编译的可执行文件
	# ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH}) #这里生成的可执行文件的名字为项目名字,${PROJECT_NAME}就是#2中PROJECT(cmakelist_test)的项目名字cmakelist_test
	# #10.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),以及生成的libxxx.so,就添加这些库的名称
	# TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)
	
	
	#6.编译生成库文件,将Sum.cpp生成共享库文件libSum.so,这条命令告诉cmake,把这些源文件编译成一个叫作“Sum”的共享库
	add_library(Sum SHARED src/Sum.cpp)
	
	#使用add_library(Sum Sum.cpp)能同时生成静态库文件libSum.a和动态库文件libSum.so
	#使用add_library(Sum STATIC Sum.cpp)能生成静态库文件libSum.a
	#在linux中,库文件分为静态库和动态库两种,静态库以.a作为后缀名,共享库以.so结尾。所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间。
	#同时add_library(Sum SHARED Sum.cpp)后面的源文件可以接任意多个,同时生成一个库文件,例如add_library(Sum SHARED Sum.cpp b.cpp d.cpp hello.a ...)
	# #对于已经有的外部依赖库的添加实例如下:
	# # 寻找OpenCV库,感觉下面两步没啥作用
	# set(OpenCV_DIR /home/chaofan/opt/opencv-3.4.4/release) #相当于将后面参数赋给前面的参数,类似于给路径起了个别名
	# find_package( OpenCV 3 REQUIRED )
	# # 指定库文件路径,全局请求所有库文件,并赋值给Opencv3.0_LIB
	# file(GLOB_RECURSE Opencv3.0_LIB "/home/LiuMC/software/third_lib/opencv3.0-install/lib/*.so")
	# # 指定头文件路径
	# set(Opencv3_INLCUDE_DIRS "/home/LiuMC/software/third_lib/opencv3.0-install/include")
	# # 添加头文件到工程中
	# include_directories(include ${OpenCV_INCLUDE_DIRS})
	# # 执行主文件imageBasics.cpp,生成可执行文件imageBasics
	# add_executable( imageBasics imageBasics.cpp )
	# # 链接OpenCV库文件到工程中
	# target_link_libraries( imageBasics ${OpenCV3.0_LIB} )
	
	#7.add executable file,添加要编译的可执行文件,编译main.cpp,生成可执行文件main,也可以将main写成${PROJECT_NAME},即为当前项目名称,就是#2中PROJECT(cmakelist_test)的项目名字cmakelist_test
	add_executable(main src/main.cpp)   
	
	#8.add link library,添加可执行文件所需要的库,比如我们用到了libSum.so(命名规则:lib+name+.so),就添加该库的名称
	target_link_libraries(main Sum)  #生成的主文件可执行文件main链接到共享库文件库libSum.so,可执行程序即可调用库文件中的函数

到 build 文件夹进行编译

	cd build
	cmake .. 
	make

在build的目录下生成了一个可执行的文件main,运行:

	命令:
	./main

 结果如下:

以上过程是单纯使用CMake进行编译,VS Code只作为一个编辑和调用工具。

2.2 修改 VS Code 配置文件,VS Code调用CMake

修改 launch.json

    {
        "configurations": [
                {
                    "name": "g++ -生成和调试活动文件",
                    "type": "cppdbg",
                    "request": "launch",
                    "program": "${workspaceFolder}/build/${fileBasenameNoExtension}", //运行可执行文件,此处为可执行文件的路径,包括文件名字,${fileBasenameNoExtension}即为所生成可执行文件的名字,&{workspaceFolder}为.vscode路径;
                     //"program": "${command:cmake.launchTargetPath}", //通过cmake tools解析得到要运行可执行程序的绝对路径包括文件名字,该类型的路径设置适用于cmake tool生成可执行程序,(camketool是vscode扩展库中的插件,它的执行和json文件执行是不同的),目前用不上
                    "args": [],
                    "stopAtEntry": false,
                    "cwd": "${fileDirname}", //调试时的工作目录,设置调试器启动的应用程序的工作目录,这里的路径不是要调试的可执行文件的绝对路径,与task.json的cwd路径不一样,这里可以为所运行的程序main.cpp的绝对路径或者.vscode所在的目录(绝对路径),不包括文件名字,一般用所运行程序的绝对路径即可,即${fileDirname},
                    // "cwd": "${workspaceFolder}",   
                    "environment": [], //目前测试不改变环境,也可以进行编译运行和调试,此处有待深究
                    "externalConsole": false, //控制是否显示在新的终端
                    // "externalConsole": true,
                    "MIMode": "gdb",
                    "setupCommands": [
                        {
                            "description": "为 gdb 启用整齐打印",
                            "text": "-enable-pretty-printing",
                            "ignoreFailures": true
                        },
                        {
                            "description": "将反汇编风格设置为 Intel",
                            "text": "-gdb-set disassembly-flavor intel",
                            "ignoreFailures": true
                        }
                    ],
                    "preLaunchTask": "build",
                }
            ],
            "version": "2.0.0"
}

修改 task.json

    {
        "options": {
            // "cwd": "${fileDirname}"
            "cwd": "${workspaceFolder}/build"    //需要进入到我们执行tasks任务的文件夹中,要调试的可执行程序的工作路径(绝对路径),不包括文件名
        },
        "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"
                ]
            }
        ],
        "version": "2.0.0"

}

修改 c_cpp_properties.jso

g++ -v -E -x c++ -

在 c_cpp_properties.json 里更新 includePath选项

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [  //头文件路径
                "${workspaceFolder}/**",
                "${workspaceFolder}/include",
                "/usr/include",
                "/usr/include/c++/11",
                "/usr/include/x86_64-linux-gnu/c++/11",
                "/usr/include/c++/11/backward",
                "/usr/lib/gcc/x86_64-linux-gnu/11/include",
                "/usr/local/include",
                "/usr/include/x86_64-linux-gnu"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",  //编译器路径
            "cStandard": "c11",  // c标准
            "cppStandard": "c++11", // c++标准
            "intelliSenseMode": "linux-gcc-x64",
            // "compileCommands": "${workspaceFolder}/build/compile_commands.json", //这一句命令一般用不上,因为有browse
            "browse": { //一般别用该参数,不需要,且易出错
                "path": ["${workspaceFolder}"],
                "limitSymbolsToIncludedHeaders": true, //一般设置为true,如果有些代码没法智能提示可以将该字段设置为false试试
                "databaseFilename": "" //用不上
            }
        }
    ],
    "version": 4
}

 以上过程即可完成整个cmake实现多文件编译运行,F5 运行结果如下:

1)点击VS code右上角三角按钮中的运行c/c++文件  2)按快捷键F5  3)VS Code界面最下面蓝色条框中的buid+小三角按钮都可以使用CMake编译运行。

VS Code右上角三角按钮中有运行c/c++文件、调试c/c++文件以及 run code 三个按钮,其中运行c/c++文件、调试c/c++文件执行路径是通过.vscode里的json文件实现cmake的编译运行的;run code按钮是在左侧栏扩展中安装的运行扩展程序,通过自动配置调用g++实现c++文件的编译运行的,与前两者的执行路径不同。

使用cmake tools进行调试时:快速调试可以使用命令面板中的CMake: Debug目标命令,或者通过按相关的热键来启动(默认是ctrl+F5);使用VS Code的launch.jsonh和task.json调试时:按快捷键F5,或者右上角的调试按钮),其中运行c/c++文件、按快捷键F5都是通过.vscode里的json文件实现cmake编译运行的,而VS code界面最下面蓝色条框中的buid+小三角按钮没有通过.vscode里的json文件实现(但不影响所有文件的执行路径和生成路径);


一般在CMakeList、.vscode的配置都没问题的时候,点击VS code右上角三角按钮中的运行c/c++文件或者按快捷键F5运行.cpp文件可能会提示执行路径有问题,但是执行路径确实没问题,此问题的原因可能是由于build中已经存在内容,而影响下一个.cpp文件的编译运行,因此可以将build及里面的内容都删除掉,重新新建一个。

2.3 VS Code插件生成CMakeList

可参照 文档 

https://blog.csdn.net/Tengfei_Y/article/details/126893402ubuntu系统配置vscode编译调试运行c++、cmake、ros程序_ubuntu vscode cmake-CSDN博客

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

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

相关文章

HR人才测评,表达能力与岗位胜任力素质测评

什么是表达能力&#xff1f; 表达能力指的就是在语言能力基础之上发展形成的一种语用能力&#xff0c;可以结合自己所掌握的语言来实现交际的目的&#xff0c;能正确且灵活的把语言材料组合成为语言并且表达出想要表达的内容。 在百度百科中有如此定义&#xff0c;表达能力…

go-zero整合asynq实现分布式定时任务

本教程基于go-zero微服务入门教程&#xff0c;项目工程结构同上一个教程。 go-zero微服务入门教程&#xff08;点击进入&#xff09; 本教程主要实现go-zero整合asynq实现分布式定时任务。 本文源码&#xff1a;https://gitee.com/songfayuan/go-zero-demo &#xff08;教程源…

超详细的胎教级Stable Diffusion使用教程(五)

这套课程分为五节课&#xff0c;会系统性的介绍sd的全部功能和实操案例&#xff0c;让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion&#xff0c;它究竟有多强大&#xff1f; 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

【DevOps】Linux 安全:iptables 组成、命令及应用场景详解

导读&#xff1a;全面掌握 iptables&#xff1a;从基础到实践 在 Linux 系统中&#xff0c;iptables 是一个非常强大的工具&#xff0c;它不仅是系统管理员用来构建和管理网络防火墙的首选工具&#xff0c;而且也是一个功能丰富的网络流量处理系统。无论是进行包过滤、监控网络…

大数据测试

1、前言 大数据测试是对大数据应用程序的测试过程&#xff0c;以确保大数据应用程序的所有功能按预期工作。大数据测试的目标是确保大数据系统在保持性能和安全性的同时&#xff0c;平稳无差错地运行。 大数据是无法使用传统计算技术处理的大型数据集的集合。这些数据集的测试涉…

用大于meilisearch-java-0.7.0.jar的报错的解决

Elasticsearch 做为老牌搜索引擎&#xff0c;功能基本满足&#xff0c;但复杂&#xff0c;重量级&#xff0c;适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需求&#xff0c;极快&#xff0c;单文件&#xff0c;超轻量。 所以&#xff0c;对于中小型项目来说…

OBS插件--复合模糊

复合模糊 复合是一款滤镜插件&#xff0c;支持多种模糊类型和多种蒙版效果。支持模糊源的部分显示区域&#xff0c;可以反选区域进行模糊&#xff0c;这个功能对于场景部分区域需要遮盖非常实用。 下面截图演示下操作步骤&#xff1a; 首先&#xff0c;打开 OBS直播助手 在…

德国Dürr杜尔机器人维修技巧分析

在工业生产中&#xff0c;杜尔工业机器人因其高效、精准和稳定性而备受青睐。然而&#xff0c;即便是最精良的设备&#xff0c;也难免会出现Drr机械手故障。 一、传感器故障 1. 视觉传感器故障&#xff1a;可能导致机器人无法正确识别目标物&#xff0c;影响工作效率。解决方法…

5.神经网络-激活函数

目录 1. 激活函数不是阶跃函数 1.1 激活函数和阶跃函数都是非线性函数 1.2 激活函数不是阶跃函数 2. sigmoid 函数 2.1 sigmoid 函数表达式 2.2 sigmoid 函数 Python 实现 2.4 sigmoid 函数图 3. ReLU 函数 3.1 ReLU 函数表达式 3.2 ReLU 函数 Python 实现 3.4 ReLU…

现代制造之数控机床篇

现代制造 有现代技术支撑的制造业&#xff0c;即无论是制造还是服务行业&#xff0c;添了现代两个字不过是因为有了现代科学技术的支撑&#xff0c;如发达的通信方式&#xff0c;不断发展的互联网&#xff0c;信息化程度加强了&#xff0c;因此可以为这两个行业增加了不少优势…

Rust的协程机制:原理与简单示例

在现代编程中&#xff0c;协程&#xff08;Coroutine&#xff09;已经成为实现高效并发的重要工具。Rust&#xff0c;作为一种内存安全的系统编程语言&#xff0c;也采用了协程作为其并发模型的一部分。本文将深入探讨Rust协程机制的实现原理&#xff0c;并通过一个简单的示例来…

文献阅读——LPPLS(2)

A study on the bursting point of Bitcoin based on the BSADF and LPPLS methods 文献来源[2] Yao, Can-Zhong, and Hong-Yu Li. “A study on the bursting point of Bitcoin based on the BSADF and LPPLS methods.” The North American Journal of Economics and Financ…

Linux:Figshare网站文件下载(非浏览器)

参考aws亚马逊云下载figshare内容 Linux wget -c 下载网页内容crul -C_figshare怎么下载数据-CSDN博客 尝试一下 mamba search awscli mamba install awscli2.15.48 aws --version通过网页获取下载链接 比如&#xff1a; https://s3-eu-west-1.amazonaws.com/pfigshare-u-…

C# Linq中的自定义排序

1.开发过程中&#xff0c;会遇到OrderBy/OrderByDescending排序无法满足的情况&#xff0c;此时就需要自定义排序&#xff0c;按照想要的排序规则取排序&#xff0c;比如订单的状态等等。 2.自定义泛型比较器代码如下&#xff1a; /// <summary>/// 自定义泛型比较器(用…

HNCTF-PWN

1.ez_pwn 直接看危险函数&#xff0c;不能溢出&#xff0c;只能覆盖ebp。 后面紧接的又是leave,ret 很明显是栈迁移&#xff0c;通过printf打印出ebp&#xff0c;通过偏移计算出栈地址。 通过gdb调试&#xff0c;偏移是0x38 以下是payload&#xff1a; from pwn import * #i…

初始Java篇(JavaSE基础语法)(8)认识String类(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 简单介绍&#xff1a;在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可…

Kafka和Spark Streaming的组合使用学习笔记(Spark 3.5.1)

一、安装Kafka 1.执行以下命令完成Kafka的安装&#xff1a; cd ~ //默认压缩包放在根目录 sudo tar -zxf kafka_2.12-2.6.0.tgz -C /usr/local cd /usr/local sudo mv kafka_2.12-2.6.0 kafka-2.6.0 sudo chown -R qiangzi ./kafka-2.6.0 二、启动Kafaka 1.首先需要启动K…

C++ | Leetcode C++题解之第84题柱状图中最大的矩形

题目&#xff1a; 题解&#xff1a; class Solution { public:int largestRectangleArea(vector<int>& heights) {int n heights.size();vector<int> left(n), right(n, n);stack<int> mono_stack;for (int i 0; i < n; i) {while (!mono_stack.em…

【漏洞复现】泛微OA E-Cology portalTsLogin文件读取漏洞

漏洞描述&#xff1a; 泛微E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology portalTsLogin存在任意文件读取漏洞&#xff0c;允许未经授权的用户读取服…

物联网到底物联了个啥?——青创智通

工业物联网解决方案-工业IOT-青创智通 物联网&#xff0c;这个听起来似乎颇具科技感和未来感的词汇&#xff0c;其实早已悄然渗透到我们生活的方方面面。从智能家居到智慧城市&#xff0c;从工业自动化到医疗健康&#xff0c;物联网技术正在以其独特的魅力改变着我们的生活方式…