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

CMake编译学习笔记

CMake学习笔记

  • CMake编译概述
    • CMake学习资源
    • CMake编译
      • 项目架构
      • cmake指令
      • CMakeList基础准则
  • CMakeList编写
    • 项目构建
      • cmake_minimum_required() 和 project()
      • set()
      • find_package()
      • add_executable()
      • aux_source_directory()
    • 连接库文件
      • include_directories()和target_include_directories()
      • add_library()
      • add_subdirectory()
      • target_link_libraries()
      • target_link_directories()
    • 安装与日志
      • install target
      • install Files和install programs
      • install Directories
      • message()

CMake编译概述

CMake学习资源

  • CMake官方推荐教程:CMake Tutorial
  • 知乎博客(偏向实践,以项目方式说明):全网最细的CMake教程!(强烈建议收藏)
  • 简书博文(博主对官方文档进行中文说明并配上相关例子):Cmake

对于CMake推荐在项目使用中学习,通过查阅文档和实际测试每个指令的用处能有效的掌握CMake。

CMake编译

项目架构

CMake是一种常用的C++项目编译工具,通常一个完备的CMake项目包括了如下几部分:

  • src:源代码文件夹
  • include:头文件文件夹
  • doc:项目文档文件夹
  • build:编译文件夹
  • devel:ROS1用于保存编译后程序的文件夹
  • run.sh:项目启动脚本(ROS中无)
  • CMakeList.txt:CMake文件,应在项目根目录和各级子文件夹内存在(例如ROS内就是在工作空间根目录和各个功能包根目录下存在)

对于一个C++项目,在编译完成后还可能需要使用make install将其安装至指定位置。

cmake指令

对于一个项目会构建一个build文件夹用于存放编译生成的中间文件,从而避免污染工作空间:

mkdir build & cd build			# 新建build目录并进入
cmake ..						# 构建MakeFile(build父目录)
make -j5						# 编译

cmake ..表示使用cmake构建当前文件夹build的父文件夹(项目根目录)。上述指令还可简化为使用参数--build

mkdir build & cd build			# 新建build目录并进入
cmake --build ..				# 构建并编译(build父目录)

cmake指令的更多参数和使用可参考官方手册:cmake

CMakeList基础准则

CMakeList文件的编写主要遵从如下几条原则:

  • ${变量名}被用于引用CMake变量,使用IF控制语句除外
  • 指令参数被括弧括起,用空格分开:project(projectname [cxx])
  • 指令是大小写无关的(官方推荐小写),参数、变量是大小写相关的
  • 参数中包括空格,则应用双引号括起:"fn nc.c"
  • 使用#注释

CMakeList编写

项目构建

cmake_minimum_required() 和 project()

cmake_minimum_required用于指定所使用CMake的最低版本号,置于CMakeList.txt的开头;project指令则用于指定项目的名称,指令的用法如下:

cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])
project(<PROJECT-NAME> [<language-name>...])
  • VERSION:关键字,表明后续添加为版本号
    -min: 设置所使用CMake的最低版本号,格式为major.minor[.patch[.tweak]]
    • policy_max:设置所使用的CMake的最高版本号,应高于min
  • <PROJECT-NAME>:设置项目名称
  • <language-name>:设置项目支持的语言,不加表示默认所有编程语言

使用示例如下所示:

cmake_minimum_required(VERSION 3.2.4)
project(Demo)

project指令同时隐式的定义了几个变量:

  • <projectname>_BINARY_DIR:项目编译目录的绝对路径
  • <projectname>_SOURCE_DIR:项目源目录的绝对路径
  • PROJECT_BINARY_DIR:自动绑定<projectname>_BINARY_DIR的内容
  • PROJECT_SOURCE_DIR:自动绑定<projectname>_SOURCE_DIR的内容

通常在调用上述CMake变量时,使用PROJECT_BINARY_DIRPROJECT_SOURCE_DIR进行,从而避免CMake项目名称修改后需要额外修改其余内容。

更多内容可参考官方指导手册:cmake_minimum_required、project
以及博文Cmake命令之cmake_minimum_required介绍和Cmake命令之project介绍

set()

用于设置variable的值为 value,指令用法如下:

set(<variable> <value>... [PARENT_SCOPE])
  • variable:被设置的参数
  • value:设置的值

例如在CMake中指定使用的C++标准为C++ 14,则可定义变量${CMAKE_CXX_STANDARD}的值为14:

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)

更多用法(环境变量、缓存变量、定义域等)可查看官方手册:set,以及博文Cmake命令之set介绍

find_package()

用于查找包(通常由项目外部的第三方库提供),并加载其包特定的详细信息。指令使用方式如下:

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE][REQUIRED] [[COMPONENTS] [components...]][OPTIONAL_COMPONENTS components...][REGISTRY_VIEW  (64|32|64_32|32_64|HOST|TARGET|BOTH)][GLOBAL][NO_POLICY_SCOPE][BYPASS_PROVIDER])
  • PackageName:需要查找的包名
  • version:可指定查找包的版本要求
    • versionMin...versionMax:如1.1.1.1…1.2.2.1(包括1.2.2.1)
    • versionMin...[<]versionMax:如1.1.1.1…<1.2.2.1(不包括1.2.2.1)
  • QUIET:禁止输出查找日志信息
  • REQUIRED:当未找到满足条件的包时停止构建
  • COMPONENTS:指定要查找的组件

例如如下即为常见的ROS查找catkin包相关组件:

find_package(catkin REQUIRED COMPONENTSgeometry_msgsmessage_generationnav_msgsroscpprospystd_msgstfvisualization_msgs
)

更多使用方法可以参考博文Cmake命令之find_package介绍
以及官方手册:find_package

add_executable()

用于从源码文件编译得到一个可执行文件,指令用法如下:

add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL][source1] [source2 ...])
  • name:编译所得的可执行文件命名
  • source:用于编译的源文件
  • [EXCLUDE_FROM_ALL]:设置后,表明该可执行文件将被排除在all外,需要手动确定才能执行生成

通常仅指定构建的可执行文件名和使用的源码,如:

add_executable(Demo main.c)

更多用法参考博文Cmake命令之add_executable介绍
以及官方手册:add_executable

aux_source_directory()

当一个文件夹内存在多个源代码时,可使用该指令将其定义为一个变量,从而方便调用:

aux_source_directory(<dir> <variable>)
  • dir:源代码路径
  • variable:变量名

例如,下列示例将当前目录下所有源代码加入至DIR_SRCS,并用其编译生成可执行文件Demo

cmake_minimum_required (VERSION 2.8)
project (Demo2)aux_source_directory(. DIR_SRCS)
add_executable(Demo ${DIR_SRCS})

更多用法可参考官方手册:aux_source_directory

连接库文件

include_directories()和target_include_directories()

两者都用于将给定目录添加到编译器用于搜索包含文件的目录中,不同之处在于include_directories将对整个CMakeList每个目标添加搜索路径,而target_include_directories则仅针对指定目标添加搜索路径,两者用法如下:

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]<INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
  • <target>target_include_directories中的指定目标
  • [AFTER|BEFORE]:可显式指定添加头文件搜索路径的位置
    • 在原有搜索路径的最后(AFTER)
    • 在原有搜索路径的最前(BEFORE)
  • dirinclude_directories中添加的搜索路径,相对路径将被解释为基于当前源目录开始
  • <INTERFACE|PUBLIC|PRIVATE>
    • INTERFACE :仅target的头文件可使用该路径
    • PUBLICtarget的头文件和源文件均可以使用
    • PRIVATEtarget对应的源文件可以使用
  • itemstarget_include_directories中添加的搜索路径,相对路径将被解释为基于当前源目录开始

此处可参考博文CMake 添加头文件搜索路径 include_directories, target_include_directories
以及官方手册:include_directories、target_include_directories

add_library()

用于从源码文件编译得到一个库文件,指令用法如下:

add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL][<source>...])
  • <name>:构建的库文件的名称,最终生成的库文件名字将根据本机惯例进行产生,如:lib<name>.lib<name>.a
  • [STATIC | SHARED | MODULE]:构建库文件的类型
    • STATIC:静态库文件
    • SHARED:动态库文件
    • MODULE:模块库文件
  • source:用于编译的源文件
  • [EXCLUDE_FROM_ALL]:设置后,表明该库将被排除在all外,需要手动确定才能执行生成
  • 生成的库文件相关CMake参数以INTERFACE_开头

生成的库文件将被输出至${ARCHIVE_OUTPUT_DIRECTORY}${LIBRARY_OUTPUT_DIRECTORY}${RUNTIME_OUTPUT_DIRECTORY}中:

  • ARCHIVE_OUTPUT_DIRECTORY:静态库文件存储位置
  • LIBRARY_OUTPUT_DIRECTORY:Lib文件存储位置
  • RUNTIME_OUTPUT_DIRECTORY:动态库文件存储位置

若需要导入一个已经生成的库文件还可以使用如下方式:

add_library(<name> [STATIC | SHARED | MODULE] IMPORTED [GLOBAL])
  • IMPORTED关键字用于说明该库文件已生成无需编译
  • GLOBAL:设置后表明该库文件全局可见
  • 使用此方法生成的库文件相关CMake参数以IMPORTED_开头

更多用法可以参考博文:cmake : add_library详解或者官方手册:add_library

add_subdirectory()

用于添加需要被构建的子目录,指令用法如下:

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM])
  • source_dir:指定子目录,其内应包含CMakeList.txt文件、源码文件
  • binary_dir:指定输出可执行文件位置

例如项目内包含子文件夹src,其内包括CMakeList.txt和相关源码。则在项目根目录CMakeList.txt中添加如下指令使其被构建:

add_subdirectory(src)

更多用法可以参考博文Cmake命令之add_subdirectory介绍以及官方手册:add_subdirectory

target_link_libraries()

用于连接可执行文件和对应的库文件:

target_link_libraries(<target> ... <item>... ...)
  • target:被连接的可执行文件
  • item:库文件名称、路径等

例如,可执行文件main连接生成的库文件B

add_executable(main main.c)
add_library(B SHARED b.c)
target_link_libraries(main B)

更多使用方式可参考官方手册:target_link_libraries

target_link_directories()

用于连接可执行文件和用于查找依赖库文件的路径,指令用法如下:

target_link_directories(<target> [BEFORE]<INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

更多使用方式可参考官方手册:target_link_directories

安装与日志

在CMake中安装使用install指令实现,针对不同的文件类型,该指令具备不同的使用方式,可参考官方手册查看详细内容:install

install target

install(TARGETS targets... [EXPORT <export-name>][RUNTIME_DEPENDENCIES args...|RUNTIME_DEPENDENCY_SET <set-name>][[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE|FILE_SET <set-name>|CXX_MODULES_BMI][DESTINATION <dir>][PERMISSIONS permissions...][CONFIGURATIONS [Debug|Release|...]][COMPONENT <component>][NAMELINK_COMPONENT <component>][OPTIONAL] [EXCLUDE_FROM_ALL][NAMELINK_ONLY|NAMELINK_SKIP]] [...][INCLUDES DESTINATION [<dir> ...]])
  • TARGETS:关键字,表明安装的对象为Target
  • targets:指定目标文件名
  • [ARCHIVE|LIBRARY|RUNTIME……]:指定文件类型
    • ARCHIVE:静态库
    • LIBRARY:动态库
    • RUNTIME:可执行目标二进制文件
  • [DESTINATION <dir>]:指定安装路径
    • 若路径<dir>为绝对路径,以"/"开头
    • 若路径<dir>为相对路径,则实际安装路径为:${CMAKE_INSTALL_PREFIX}<dir>
  • [PERMISSIONS permissions...] :用户权限,最高777(参考liunx权限)
    • OWNER_WRITE :拥有者写入权限
    • OWNER_READ :拥有者读取权限
    • OWNER_EXECUTE :组成员执行权限
    • GROUP_WRITE :组成员写入权限
    • GROUP_READ :组成员读取权限
    • GROUP_EXECUTE :组成员执行权限
    • WORLD_WRITE :其他人写入权限
    • WORLD_READ :其他人读取权限
    • WORLD_EXECUTE :其他人执行权限

例如,如下使用方式:

install(TARGETS myExe mySharedLib myStaticLibRUNTIME DESTINATION binLIBRARY DESTINATION libARCHIVE DESTINATION lib/static)
install(TARGETS mySharedLib DESTINATION /some/full/path)

上述例子实现如下目标:

  • 二进制文件(RUNTIME)myExe安装至${CMAKE_INSTALL_PREFIX}/bin
  • 动态库文件(LIBRARY)mySharedLib安装至${CMAKE_INSTALL_PREFIX}/lib/some/full/path
  • 静态库文件(ARCHIVE)myStaticLib安装至${CMAKE_INSTALL_PREFIX}/lib/static

install Files和install programs

install(<FILES|PROGRAMS> files...TYPE <type> | DESTINATION <dir>[PERMISSIONS permissions...][CONFIGURATIONS [Debug|Release|...]][COMPONENT <component>][RENAME <name>] [OPTIONAL] [EXCLUDE_FROM_ALL])
  • <FILES|PROGRAMS>:关键字,表明安装的对象类型为FILESPROGRAMS,应选择其一填写
    • FILES:权限为拥有者读写、组成员读、其余人读(644)
    • PROGRAMS:权限为拥有者读写执行、组成员读执行、其余人读执行(755)
  • files…:指定文件名称
  • TYPE:关键字,表明文件的类型
  • [DESTINATION <dir>]:指定安装路径

文件类型可选如下所示:
在这里插入图片描述

install Directories

install(DIRECTORY dirs...TYPE <type> | DESTINATION <dir>[FILE_PERMISSIONS permissions...][DIRECTORY_PERMISSIONS permissions...][USE_SOURCE_PERMISSIONS] [OPTIONAL] [MESSAGE_NEVER][CONFIGURATIONS [Debug|Release|...]][COMPONENT <component>] [EXCLUDE_FROM_ALL][FILES_MATCHING][[PATTERN <pattern> | REGEX <regex>][EXCLUDE] [PERMISSIONS permissions...]] [...])
  • [FILE_PERMISSIONS permissions...]:目录内文件权限
  • [DIRECTORY_PERMISSIONS permissions...]:目录本身权限
  • [USE_SOURCE_PERMISSIONS]:若未指定FILE_PERMISSIONS permissions...,则根据源文件权限赋予
  • [PATTERN <pattern>:采用模式匹配进行筛选内容 <pattern>
  • REGEX <regex>:采用正则匹配进行筛选内容<regex>
  • [EXCLUDE]:安装时,排除筛选得到的文件
  • [PERMISSIONS permissions...]:指定筛选得到的文件的权限

例如使用该命令执行如下:

INSTALL(DIRECTORY icons scripts/ DESTINATION share/myprojPATTERN "CVS" EXCLUDEPATTERN "scripts/*" PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE)

上述指令执行如下操作:

  • 将目录icons安装至${CMAKE_INSTALL_PREFIX}/share/myproj
  • 将目录scripts/ 中的内容安装${CMAKE_INSTALL_PREFIX}/share/myproj
  • 在进行安装时,排除名字包含CVS 的文件
  • 在进行安装时,将scripts/* 文件的权限指定为731

message()

用于向终端中输出用户定义的编译日志信息,指令用法如下:

message([<mode>] "message text" ...)
  • mode:日志类型
    • FATAL_ERROR:红色CMake Error,将终止CMake编译
    • SEND_ERROR:CMake Error,将跳过生成但不影响编译
    • WARNING:黄色CMake Warning,不影响CMake编译
    • AUTHOR_WARNING:CMake Warning (dev),不影响CMake编译
    • STATUS:输出一些编译过程中的简明信息
    • VERBOSE:输出一些编译过程中的详细信息
  • message text:输出的日志内容

更多使用方式可参考官方手册:message

相关文章:

CMake编译学习笔记

CMake学习笔记CMake编译概述CMake学习资源CMake编译项目架构cmake指令CMakeList基础准则CMakeList编写项目构建cmake_minimum_required() 和 project()set()find_package()add_executable()aux_source_directory()连接库文件include_directories()和target_include_directories…...

Day913.反向代理和网关是什么关系 -SpringBoot与K8s云原生微服务实践

反向代理和网关是什么关系 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于反向代理和网关是什么关系的内容。 一、反向代理 反向代理 是一种网络技术&#xff0c;用于将客户端的请求转发到一个或多个服务器上&#xff0c;并将响应返回给客户端。与正向代理不同&am…...

IT行业就业趋势显示:二季度平均月薪超8千

我国的IT互联网行业在近些年来规模迅速扩大&#xff0c;技能和技术水平也明显提升&#xff0c;目前IT互联网行业已经成为社会发展中新型产业的重要组成部分&#xff0c;行业的人才队伍也在不断的发展壮大&#xff0c;选择进入入互联网行业工作的人也越来越多。 根据58同城前段…...

【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)

简介 五子棋作为一个棋类竞技运动&#xff0c;在民间十分流行&#xff0c;为了熟悉五子棋规则及技巧&#xff0c;以及研究简单的人工智能&#xff0c;决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用&#xff0c;客户端…...

C#:Krypton控件使用方法详解(第十四讲) ——kryptonSeparator

今天介绍的Krypton控件中的kryptonSeparator。下面介绍控件的外观属性如下图所示&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;DrawMoveIndicator属性&#xff1a;表示确定移动分隔符时是否绘制移动…...

Java的jar包打包成exe应用

将springboot项目使用maven打出的jar包&#xff0c;打成windows平台下exe应用程序包&#xff08;自带jre环境&#xff09;。 工具&#xff1a;1、exe4j 2、Inno Setup 工具放到网盘&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1ZHX8P7u-7GBxaC6uaIC8Ag 提取码&#x…...

Latex学习笔记

Latex 学习笔记 快速入门 编译软件: TeX Live TexStudio, Ctex, 线上: Overleaf第一个示例代码&#xff1a; \documentclass{article} % 设置文档使用的文档类 % 导言区 \title{my first Latex document} \author{Jclian91} \date{\today} \begin{document} % 正文区\maket…...

【c++复习】C++的基础知识(常用关键字、缺省参数、函数重载、引用)

C基础写在开头C基础常用关键字using namespace流插入和流提取操作符内联函数(inline)宏auto关键字 (c11nullptr (c11缺省参数函数重载引用写在开头 C基础部分我想介绍如下几个关键点&#xff1a; 常见关键字命名空间的定义和使用缺省参数函数重载引用、指针和引用的区别内联函…...

Docker入门建议收藏 第二部分

二、Docker 容器技术与虚拟机的区别 Docker 到底是个什么东西呢&#xff1f;我们在理解 Docker 之前&#xff0c;首先得先区分清楚两个概念&#xff0c;容器和虚拟机。 虚拟机 虚拟机&#xff08;Virtual Machine&#xff09;指通过软件模拟的具有完整硬件系统功能的、运行在…...

蓝桥杯三月刷题 第7天

文章目录&#x1f4a5;前言&#x1f609;解题报告&#x1f4a5;三角回文数&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;数数&#x1f914;一、思路:&#x1f60e;二、代码&#xff1a;&#x1f4a5;数组切分&#x1f914;一、思路:&#x1f60e;二、…...

面试官问百万数据excel导出功能如何实现?

文章目录 背景实现1.异步处理1.1 使用job1.2 使用mq2.使用easyexcel4.多个sheet5.计算limit的起始位置6.文件上传到OSS7.通过WebSocket推送通知8.总条数可配置9.order by商品编号总结背景 用户在UI界面上点击全部导出按钮,就能导出所有商品数据。 咋一看,这个需求挺简单的。…...

理解HTTPS及配置

HTTP的弊端及HTTPS的由来 众所周知HTTP协议是以TCP协议为基石诞生的一个用于传输Web内容的一个网络协议,在“网络分层模型”中属于“应用层协议”的一种.那么在这里我们并不研究该协议标准本身,而是从安全角度去探究使用该协议传输数据本身存在的安全问题:(1)、通信使用明文(不…...

IP-guard浏览器上传下载智能加解密,让管理更省心省力

现在员工日常工作中经常会通过浏览器访问公司的业务系统&#xff08;OA、JIRA等&#xff09;&#xff0c;或者访问其他外部系统&#xff0c;访问下载服务器的文档变得更便捷&#xff0c;工作地点也不再局限于办公室中。为确保应用系统机密安全且又不影响员工的正常工作&#xf…...

leetcode day22 位运算

位运算咋这么老难 剑指 Offer 56 - I. 数组中数字出现的次数 借评论区大佬答案&#xff1a;nums [1,2,10,4,1,4,3,3] a^a0a^0aa^b^ca^c^ba&(-a)最低位为1的二进制&#xff08;从又到左&#xff09;所有的异或结果得到sum2^108flag-8&88可分为两组&#xff0c;一组为与…...

java中如何判断map是否为空

java中判断map是否为空的方法是&#xff1a;利用isEmpty()函数来判断。函数介绍&#xff1a;isEmpty()是Java中用于判断某种容器是否有元素的系统库函数。如用来判断ArrayList&#xff0c;HashSet&#xff0c;HashMap是否有元素等。在Java中&#xff0c;可以用isEmpty();判断一…...

C语言数据结构:链表的增删改查及动态创建

目录 一&#xff0c;链表与数组 ① 定义区别 ② 实现区别 二&#xff0c;链表遍历和计算链表中节点数量 ① 链表遍历 ② 计算节点数量 三&#xff0c;查找链表节点 四&#xff0c;增加节点到链表中 ① 在节点后方插入 ② 在节点前方插入 ● 在头节点前方插入 ● 在…...

「Python 基础」I/O 编程、正则表达式

文章目录1. I/O 编程文件读写StringIO 和 BytesIO操作文件和目录序列化2. 正则表达式进阶re 模块1. I/O 编程 I/O指Input/Output&#xff1b; Input Stream 从外面&#xff08;磁盘、网络&#xff09;流进内存&#xff1b; Output Stream 从内存流到外面&#xff1b; 同步 …...

java 把pdf图片文档和文章文档转成文字的方法

java 提供了一些库和工具可以用来把 PDF 文档和图片文档转成文本。 Apache PDFBox&#xff1a;这是一个开源的 PDF 库&#xff0c;可以用来提取 PDF 文件中的文本内容。 iText&#xff1a;这是一个用于创建和处理 PDF 文件的库&#xff0c;可以用来提取 PDF 文件中的文本内容。…...

JavaScript 中的全部对象

宿主对象&#xff08;host Objects&#xff09;&#xff1a;由 JavaScript 宿主环境提供的对象&#xff0c;它们的行为完全由宿主环境决定。 【 浏览器环境宿主&#xff0c;全局对象window&#xff0c;window 上又有很多属性&#xff0c;如 document。 全局对象 window 上的属…...

【教学典型案例】23.部分服务总是频繁出现掉线情况

目录一&#xff1a;背景介绍问题描述解决二&#xff1a;问题分析过程解决过程设计到的知识1、nacos的data目录作用。2、nacos data目下的protocol目录3、nacos ip混乱问题三&#xff1a;总结一&#xff1a;背景介绍 问题描述 因为某些特殊原因需要把nacos迁移到另一个版本的n…...

线程安全 List 效率测试

List 常见类以及各自优缺点可自行参考 https://blog.csdn.net/weixin_39883065/article/details/111197724 本机环境 java 版本&#xff1a;1.8.0_161 window 信息&#xff1a; 测试代码 下面通过代码测试 List 线程安全类 Vector、Collections.synchronizedList(List lis…...

LeetCode 热题 C++ 581. 最短无序连续子数组 617. 合并二叉树

581. 最短无序连续子数组 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组&#xff0c;并输出它的长度。 示例 1&#xff1a; 输入&am…...

鉴源论坛 · 观模丨模型检查综述

作者 | 李建文 华东师范大学软件工程学院博导 版块 | 鉴源论坛 观模 01 模型检查的历史 模型检查是一种起源于20世纪70年代末的形式化验证技术。该技术最初由Edmund M. Clarke、E. Allen Emerson和Joseph Sifakis提出&#xff0c;他们因在模型检查领域的贡献而获得了2007年的…...

Easy Deep Learning——池化层

池化是什么&#xff1f;它有什么作用&#xff1f; 还是草地的场景&#xff0c;把草地分成一块块的网格&#xff0c;数量还是太多了&#xff0c;如何继续简化输入数据呢? 这时候可以只取一块网格中所有的小草的大小形状的平均值或者最大值作为一个输入数据&#xff0c;这样就大…...

TryHackMe-VulnNet: Active(ez 域渗透)

VulnNet: Active VulnNet Entertainment在他们以前的网络中遇到了不好的时光&#xff0c;该网络遭受了多次破坏。现在&#xff0c;他们移动了整个基础架构&#xff0c;并再次聘请您作为核心渗透测试人员。您的目标是获得对系统的完全访问权限并破坏域。 这应该是我在thm打的最…...

TencentOS Server 安装 PostgreSQL

TencentOS 简介 2019 年&#xff0c;随着腾讯公司外部客户的需求&#xff0c;以及公司开源协同战略的推进&#xff0c;tlinux 对外开源并进行了品牌升级&#xff0c;升级为 TencentOS Server。TencentOS 包含三大场景&#xff0c;分别如下&#xff1a; TencentOS Server&…...

多线程的风险 --- 线程安全

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; ✨每日一语&#xff1a;低头赶路&#xff0c;敬事如仪&#xff1b;自知自心&#xff0c;其路则明。 目 录&#x1f378;一. 线程不安全&#x1f379;二. 线程不安全的原因&#x1f…...

Linux信号详解

文章目录Linux信号什么是信号**从生活角度理解: **技术应用角度的信号进程的注意事项信号概念用kill -l命令可以察看系统定义的信号列表信号处理常见方式概览信号产生通过终端按键产生信号使用signal函数自定义SIGINT信号的处理方式使用sigprocmask函数阻塞2号信号和40号信号vo…...

JAVA使用POI操作EXCEL

设置公式totalRow.createCell(4).setCellFormula("SUM(E9:E35");// 执行公式wb.setForceFormulaRecalculation(true);合并单元格sheet.addMergedRegion(new CellRangeAddress(0, 0, 3, 7));单元格格式CellStyle cellStyle wb.createCellStyle();// 字体XSSFFont fon…...

只做笔记有必要买apple pencil吗?苹果笔的代替笔推荐

如果仅仅使用IPAD来进行打游戏和看剧的话&#xff0c;未免有些浪费。ipad的作用还是挺大的&#xff0c;可以用来做学习笔记&#xff0c;也可以用来做绘画&#xff0c;也可以用来做一些重要的内容。很多人都会认为&#xff0c;苹果的电容笔很好用&#xff0c;但是价格上要比一般…...

Hive---sqoop安装教程及sqoop操作

sqoop安装教程及sqoop操作 文章目录sqoop安装教程及sqoop操作上传安装包解压并更名添加jar包修改配置文件添加sqoop环境变量启动sqoop操作查看指定mysql服务器数据库中的表在hive中创建一个teacher表跟mysql的mysql50库中的teacher结构相同将mysql中mysql50库中的sc数据导出到h…...

【C++】register 关键字

文章目录一. 什么是寄存器&#xff1f;二. 为什么要存在寄存器&#xff1f;三. register 修饰变量一. 什么是寄存器&#xff1f; 我们都知道&#xff0c;CPU主要是负责进行计算的硬件单&#xff0c;但是为了方便运算&#xff0c;一般第一步需要先把数据从内存读取到CPU内&…...

剑指 Offer II 024. 反转链表

题目链接 剑指 Offer II 024. 反转链表 easy 题目描述 给定单链表的头节点 head&#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;h…...

从Linux内核中学习高级C语言宏技巧

Linux内核可谓是集C语言大成者&#xff0c;从中我们可以学到非常多的技巧&#xff0c;本文来学习一下宏技巧&#xff0c;文章有点长&#xff0c;但耐心看完后C语言level直接飙升。 本文出自&#xff1a;大叔的嵌入式小站&#xff0c;一个简单的嵌入式/单片机学习、交流小站 从…...

详解Python的装饰器

Python中的装饰器是你进入Python大门的一道坎&#xff0c;不管你跨不跨过去它都在那里。 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数。 def say_hello():print "hello!"def say_goodbye():print "hello!" # bug hereif…...

k8s-Pod域名学习总结

k8s-Pod域名学习总结 大纲 k8s内置DNS服务 配置Pod的域名服务 CornDNS配置 默认Pod的域名 自定义Pod的域名 实战需求 1 Pod有自己的域名 2 集群内部的Pod可以通过域名访问其他的Pod 基础准备&#xff1a; 1 k8s 集群版本1.17 k8s内置DNS服务 k8s1.17安装完成后自动创建…...

0405习题总结-不定积分

文章目录1 不定积分的基本概念2 直接积分法-基本积分公式3 第一换元法-凑微分形式法4 第二类换元法5 分部积分求不定积分6 表格法积分7 有理函数求积分后记1 不定积分的基本概念 例1 f(x){x1,x≥012e−x12,x<0求∫f(x)dxf(x) \begin{cases} x1,\quad x\ge0\\ \frac{1}{2}e^…...

QT 常用控件类型命名参考

拟定的QT的控件命名规则&#xff1a;蛇形命名方式 控件类型开头&#xff0c;以下是QT控件类型命名的参考范例 Buttons Buttons起始字符串对象名称举例Push Buttonbuttonbutton_loginTool Buttontool_button / buttonbutton_switchRadio Buttonradio_button / radioradio_boy…...

MATLAB与图像处理的那点小事儿~

目录 一、学习内容 二、matlab基本知识 三、线性点运算 四、非线性点运算&#xff0c;伽马矫正 五、直方图 1、直方图均衡化 &#xff08;1&#xff09;使用histep函数实现图像均衡化 &#xff08;2&#xff09;使用自行编写的均衡化函数实现图像均衡化 2、直方图规定…...

第十四届蓝桥杯模拟赛(第三期)Java组个人题解

第十四届蓝桥杯模拟赛&#xff08;第三期&#xff09;Java组个人题解 今天做了一下第三期的校内模拟赛&#xff0c;有些地方不确定&#xff0c;欢迎讨论和指正~ 文章目录第十四届蓝桥杯模拟赛&#xff08;第三期&#xff09;Java组个人题解填空题部分第一题【最小数】第二题【E…...

Go语言之条件判断循环语句(if-else、switch-case、for、goto、break、continue)

一、if-else条件判断语句 Go中的if-else条件判断语句跟C差不多。但是需要注意的是&#xff0c;Go中强制规定&#xff0c;关键字if和else之后的左边的花括号"{“必须和关键字在同一行&#xff0c;若使用了else if结构&#xff0c;则前段代码快的右花括号”}"必须和关…...

深入理解AQS

概念设计初衷&#xff1a;该类利用 状态队列 实现了一个同步器&#xff0c;更多的是提供一些模板方法&#xff08;子类必须重写&#xff0c;不然会抛错&#xff09;。 设计功能&#xff1a;独占、共享模式两个核心&#xff0c;state、Queue2.1 statesetState、compareAndSetSta…...

JVM学习笔记十:执行引擎

0. 前言 声明&#xff1a; 感谢尚硅谷宋红康老师的讲授。 感谢广大网友共享的笔记内容。 B站&#xff1a;https://www.bilibili.com/video/BV1PJ411n7xZ 本文的内容基本来源于宋老师的课件&#xff0c;其中有一些其他同学共享的内容&#xff0c;也有一些自己的理解内容。 1. …...

【2023-03-10】JS逆向之美团滑块

提示&#xff1a;文章仅供参考&#xff0c;禁止用于非法途径 前言 目标网站:aHR0cHM6Ly9wYXNzcG9ydC5tZWl0dWFuLmNvbS9hY2NvdW50L3VuaXRpdmVsb2dpbg 页面分析 接口流程 1.https://passport.meituan.com/account/unitivelogin主页接口&#xff1a;需获取下面的参数&#xff0…...

全志V853芯片放开快启方案打印及在快起方式下配置isp led的方法

全志V85x芯片 如何放开快启方案的打印&#xff1f; 1.主题 如何放开快启方案的打印 2.问题背景 产品&#xff1a;v851系列快启方案 软件&#xff1a;tina 其他&#xff1a;特有版本信息添加自由描述 &#xff08;如固件版本&#xff0c;复现概率&#xff0c;特定环境&#x…...

大数据 | (一)Hadoop伪分布式安装

大数据原理与应用教材链接&#xff1a;大数据技术原理与应用电子课件-林子雨编著 Hadoop伪分布式安装借鉴文章&#xff1a;Hadoop伪分布式安装-比课本详细 大数据 | &#xff08;二&#xff09;SSH连接报错Permission denied&#xff1a;SSH连接报错Permission denied 哈喽&a…...

Django/Vue实现在线考试系统-06-开发环境搭建-Django安装

1.0 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC 模型,即 Model(模型)+ View(…...

KaiwuDB 时序引擎数据存储内存对齐技术解读

一、理论1、什么是内存对齐现代计算机中内存空间都是按照 byte 划分的&#xff0c;在计算机中访问一个变量需要访问它的内存地址&#xff0c;从理论上看&#xff0c;似乎对任何类型的变量的访问都可以从任何地址开始。但在实际情况中&#xff0c;通常在特定的内存地址才能访问特…...

IR 808 Alkyne,IR-808 alkyne,IR 808炔烃,近红外吲哚类花菁染料

【产品理化指标】&#xff1a;中文名&#xff1a;IR-808炔烃英文名&#xff1a;IR-808 alkyne&#xff0c;Alkyne 808-IR CAS号&#xff1a;N/AIR-808结构式&#xff1a;规格包装&#xff1a;10mg&#xff0c;25mg&#xff0c;50mg&#xff0c;接受各种复杂PEGS定制服务&#x…...

elasticsearch

这里写目录标题1.初识ElasticSearch1.1 了解ES1.2 倒排索引1.2.1 正向索引1.2.2 倒排索引1.2.3 正向和倒排1.3 ES的一些概念1.3.1 文档和字段1.3.2 索引和映射1.3.3 mysql和elasticsearch1.4 安装ES、kibana1.初识ElasticSearch 1.1 了解ES elasticsearch是一款非常强大的开源…...