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

一、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_Hint 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_testPROJECT(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_testadd_executable(main src/main.cpp)   #8.add link library,添加可执行文件所需要的库,比如我们用到了libSum.so(命名规则:lib+name+.so),就添加该库的名称target_link_libraries(main Sum)  #生成的主文件可执行文件main链接到共享库文件库libSum.so,可执行程序即可调用库文件中的函数

到 build 文件夹进行编译

	cd buildcmake .. 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.mzph.cn/diannao/10133.shtml

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

相关文章

差速机器人模型LQR 控制仿真(c++ opencv显示)

1 差速机器人状态方程构建 1.1差速机器人运动学模型 1.2模型线性化 1.3模型离散化 2离散LQR迭代计算 注意1&#xff1a;P值的初值为Q。见链接中的&#xff1a; 注意2&#xff1a;Q, R参数调节 注意3&#xff1a;LQR一般只做横向控制&#xff0c;不做纵向控制。LQR输出的速度…

辅助阅读代码

辅助代码工具&#xff1a; 1、sourcetrail 2、valgrind &#xff0c; qcachegrind sourcetrail&#xff0c;可以生成类图&#xff0c;以及类之间&#xff0c;函数之间的调用关系 1、安装 2、使用该工具需要使用cmake 编译一次 cmake -DCMAKE_EXPORT_COMPILE_COMMANDSON 其他…

手机同步与数据安全:让手机和电脑完美结合!

在当今这个高度信息化的社会&#xff0c;手机和电脑不仅为我们提供了丰富的信息资源&#xff0c;让我们能够随时随地获取所需的信息&#xff0c;还为我们的生活带来了极大的便利。无论是工作、学习还是娱乐&#xff0c;手机和电脑都发挥着至关重要的作用。 然而&#xff0c;随…

Paddle 实现DCGAN

传统GAN 传统的GAN可以看我的这篇文章&#xff1a;Paddle 基于ANN&#xff08;全连接神经网络&#xff09;的GAN&#xff08;生成对抗网络&#xff09;实现-CSDN博客 DCGAN DCGAN是适用于图像生成的GAN&#xff0c;它的特点是&#xff1a; 只采用卷积层和转置卷积层&#x…

优先队列——大小堆—— priority_queue

本人博客主页 本篇博客相关博客 二叉树--讲解 文章目录 目录 文章目录 前言 一、priority_queue是什么&#xff1f; 二、priority_queue的使用 1、相关函数 2、代码使用 3、堆的插入删除 三、模拟实现 1、大框架 2、仿函数 3、向下调整 4、向下调整 总结 前言 在我们学习二叉…

免费SSL证书怎么签发

大家都知道SSL证书好&#xff0c;作用大&#xff0c;安全性高&#xff0c;能加权重&#xff0c;等保必须的参考值。但是如何选择合适且正确的证书也是至关重要的&#xff0c;网站更适合单域名证书、多域名证书、泛域名证书、还是多域名通配符证书。 首先大家要清楚&#xff0c…

网站访问提示不安全怎么办??

当网站访问时提示“不安全”&#xff0c;这通常与网站的SSL证书有关&#xff0c;或者是网站本身存在一些安全风险。以下是一些解决步骤和建议&#xff1a; 1、检查URL前缀&#xff1a;首先&#xff0c;检查URL是否以https://开头。如果仍然是http://&#xff0c;则网站没有使用…

我必须要吹一波MATLAB 2024a,太牛逼了!|福利:附安装教程及下载地址

最近逛MATLAB官网&#xff0c;发现MATLAB 2024a版本已经Pre-release了&#xff0c;翻了下release note&#xff0c;不得不感叹&#xff0c;实在是太强了&#xff01; 这次重点更新了四个工具箱&#xff1a; Computer Vision Toolbox Deep Learning Toolbox Instrument Contro…

鸿蒙内核源码分析(文件句柄篇) | 你为什么叫句柄

句柄 | handle int open(const char* pathname,int flags); ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); int close(int fd);只要写过应用程序代码操作过文件不会陌生这几个函数,文件操作的几个关键步骤嘛,跟把大…

Linux开发--Bootloader应用分析

Bootloader应用分析 一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次&#xff1a; 引导加载程序。包括固化在固件( firmware )中的 boot 代码(可选)&#xff0c;和 Boot Loader 两大部分。 Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 文件系统…

大华智能物联综合管理平台 fastjson远程代码执行漏洞复现

0x01 产品简介 大华ICC智能物联综合管理平台对技术组件进行模块化和松耦合,将解决方案分层分级,提高面向智慧物联的数据接入与生态合作能力。 0x02 漏洞概述 由于大华智能物联综合管理平台使用了存在漏洞的FastJson组件,未经身份验证的攻击者可利用 /evo-runs/v1.0/auths/…

【Qt】界面定制艺术:光标(cursor)、字体(font)、提示(toolTip)、焦点(focusPolicy)与样式表(styleSheet)的深度探索

文章目录 前言&#xff1a;1. cursor: 设置按钮的光标2. front&#xff1a;设置字体3. toolTip: 鼠标悬停提示4. focusPolicy&#xff1a;设置控件获取到焦点的策略5. styleSheet : 样式表总结&#xff1a; 前言&#xff1a; 在现代软件开发中&#xff0c;用户界面(UI)的设计和…

【MySQL 数据宝典】【事务锁】- 002 事务控制的演进

一、事务处理思路 1.1 排队 排队处理是事务管理最简单的方法&#xff0c;就是完全顺序执行所有事务的数据库操作&#xff0c;不需要加锁&#xff0c;简单的说就是全局排队。序列化执行所有的事务单元&#xff0c;数据库某个时刻只处理一个事务操作&#xff0c;特点是强一致性…

Java刷题-基础篇

目录 题目1&#xff1a;打印1~100内奇数和、偶数和 题目2&#xff1a;计算5的阶乘 题目3&#xff1a;计算 1!2!3!4!5! 的和 题目4&#xff1a;找1~100之间即能被3整除&#xff0c;又能被5整除的数字&#xff0c;要求必须使用break/continue 题目5&#xff1a;实现猜数字小…

LeetCode 112. 路径总和 || LeetCode 113. 路径总和ii

LeetCode 112. 路径总和 1、题目 题目链接&#xff1a;112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true…

Linux:进程概念(三.详解进程:进程状态、优先级、进程切换与调度)

上次讲了进程这些内容&#xff1a;Linux&#xff1a;进程概念&#xff08;二.查看进程、父进程与子进程、进程状态详解&#xff09; 文章目录 1.Linux中的进程状态1.1前台进程和后台进程运行状态睡眠状态磁盘休眠状态停止状态kill指令—向进程发送信号 死亡状态 2.僵尸进程2.1僵…

iOS--runloop的初步认识

runloop的初步认识 简单认识runloopEvent looprunloop其实就是个对象NSRunloop和CFRunLoopRef的依赖关系runloop与线程runloop moderunloop sourceCFRunLoopSourceCFRunLoopObserverCFRunLoopTimer runloop的实现runloop的获取添加ModeCFRunLoopAddCommonMode 添加Run Loop Sou…

C语言 | Leetcode C语言题解之第79题单词搜索

题目&#xff1a; 题解&#xff1a; int directions[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};bool check(char** board, int boardSize, int boardColSize, int** visited, int i, int j, char* s, int sSize, int k) {if (board[i][j] ! s[k]) {return false;} else if (…

NSSCTF中的web学习(md5())

目录 MD5的学习 [BJDCTF 2020]easy_md5 [LitCTF 2023]Follow me and hack me [LitCTF 2023]Ping [SWPUCTF 2021 新生赛]easyupload3.0 [NSSCTF 2022 Spring Recruit]babyphp MD5的学习 md5()函数&#xff1a; md5($a)&#xff1a;返回a字符串的散列值 md5($a,TRUE)&…

AWS云优化:实现性能和成本的最佳平衡

随着企业数字化转型的加速&#xff0c;对云计算平台的需求也不断增长。AWS作为云计算行业的领导者之一&#xff0c;提供了广泛的云服务和解决方案&#xff0c;帮助企业实现业务的创新和发展。在AWS云上部署应用程序和服务后&#xff0c;对其进行优化是至关重要的&#xff0c;以…