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_DIR和PROJECT_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)
dir:include_directories中添加的搜索路径,相对路径将被解释为基于当前源目录开始<INTERFACE|PUBLIC|PRIVATE>INTERFACE:仅target的头文件可使用该路径PUBLIC:target的头文件和源文件均可以使用PRIVATE:target对应的源文件可以使用
items:target_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:关键字,表明安装的对象为Targettargets:指定目标文件名[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>:关键字,表明安装的对象类型为FILES或PROGRAMS,应选择其一填写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,我是阿昌,今天学习记录的是关于反向代理和网关是什么关系的内容。 一、反向代理 反向代理 是一种网络技术,用于将客户端的请求转发到一个或多个服务器上,并将响应返回给客户端。与正向代理不同&am…...
IT行业就业趋势显示:二季度平均月薪超8千
我国的IT互联网行业在近些年来规模迅速扩大,技能和技术水平也明显提升,目前IT互联网行业已经成为社会发展中新型产业的重要组成部分,行业的人才队伍也在不断的发展壮大,选择进入入互联网行业工作的人也越来越多。 根据58同城前段…...
【毕业设计】基于Java的五子棋游戏的设计(源代码+论文)
简介 五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏。主要完成了人机对战和玩家之间联网对战2个功能。网络连接部分为Socket编程应用,客户端…...
C#:Krypton控件使用方法详解(第十四讲) ——kryptonSeparator
今天介绍的Krypton控件中的kryptonSeparator。下面介绍控件的外观属性如下图所示:Cursor属性:表示鼠标移动过该控件的时候,鼠标显示的形状。属性值如下图所示:DrawMoveIndicator属性:表示确定移动分隔符时是否绘制移动…...
Java的jar包打包成exe应用
将springboot项目使用maven打出的jar包,打成windows平台下exe应用程序包(自带jre环境)。 工具:1、exe4j 2、Inno Setup 工具放到网盘,链接:https://pan.baidu.com/s/1ZHX8P7u-7GBxaC6uaIC8Ag 提取码&#x…...
Latex学习笔记
Latex 学习笔记 快速入门 编译软件: TeX Live TexStudio, Ctex, 线上: Overleaf第一个示例代码: \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基础部分我想介绍如下几个关键点: 常见关键字命名空间的定义和使用缺省参数函数重载引用、指针和引用的区别内联函…...
Docker入门建议收藏 第二部分
二、Docker 容器技术与虚拟机的区别 Docker 到底是个什么东西呢?我们在理解 Docker 之前,首先得先区分清楚两个概念,容器和虚拟机。 虚拟机 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在…...
蓝桥杯三月刷题 第7天
文章目录💥前言😉解题报告💥三角回文数🤔一、思路:😎二、代码:💥数数🤔一、思路:😎二、代码:💥数组切分🤔一、思路:😎二、…...
面试官问百万数据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浏览器上传下载智能加解密,让管理更省心省力
现在员工日常工作中经常会通过浏览器访问公司的业务系统(OA、JIRA等),或者访问其他外部系统,访问下载服务器的文档变得更便捷,工作地点也不再局限于办公室中。为确保应用系统机密安全且又不影响员工的正常工作…...
leetcode day22 位运算
位运算咋这么老难 剑指 Offer 56 - I. 数组中数字出现的次数 借评论区大佬答案:nums [1,2,10,4,1,4,3,3] a^a0a^0aa^b^ca^c^ba&(-a)最低位为1的二进制(从又到左)所有的异或结果得到sum2^108flag-8&88可分为两组,一组为与…...
java中如何判断map是否为空
java中判断map是否为空的方法是:利用isEmpty()函数来判断。函数介绍:isEmpty()是Java中用于判断某种容器是否有元素的系统库函数。如用来判断ArrayList,HashSet,HashMap是否有元素等。在Java中,可以用isEmpty();判断一…...
C语言数据结构:链表的增删改查及动态创建
目录 一,链表与数组 ① 定义区别 ② 实现区别 二,链表遍历和计算链表中节点数量 ① 链表遍历 ② 计算节点数量 三,查找链表节点 四,增加节点到链表中 ① 在节点后方插入 ② 在节点前方插入 ● 在头节点前方插入 ● 在…...
「Python 基础」I/O 编程、正则表达式
文章目录1. I/O 编程文件读写StringIO 和 BytesIO操作文件和目录序列化2. 正则表达式进阶re 模块1. I/O 编程 I/O指Input/Output; Input Stream 从外面(磁盘、网络)流进内存; Output Stream 从内存流到外面; 同步 …...
java 把pdf图片文档和文章文档转成文字的方法
java 提供了一些库和工具可以用来把 PDF 文档和图片文档转成文本。 Apache PDFBox:这是一个开源的 PDF 库,可以用来提取 PDF 文件中的文本内容。 iText:这是一个用于创建和处理 PDF 文件的库,可以用来提取 PDF 文件中的文本内容。…...
JavaScript 中的全部对象
宿主对象(host Objects):由 JavaScript 宿主环境提供的对象,它们的行为完全由宿主环境决定。 【 浏览器环境宿主,全局对象window,window 上又有很多属性,如 document。 全局对象 window 上的属…...
【教学典型案例】23.部分服务总是频繁出现掉线情况
目录一:背景介绍问题描述解决二:问题分析过程解决过程设计到的知识1、nacos的data目录作用。2、nacos data目下的protocol目录3、nacos ip混乱问题三:总结一:背景介绍 问题描述 因为某些特殊原因需要把nacos迁移到另一个版本的n…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
