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

CMake基础介绍

1、CMake 概述

CMake 是一个项目构建工具,并且是跨平台的;关于项目构建目前比较流行的还有 Makefile(通过 Make 命令进行项目的构建),

大多 IDE 软件都集成了 make,比如:VS 的 nmake、linux 下的 GNU make、Qt 的 qmake 等,若自己动手写 makefile,会发现

makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时容易出错

而 CMake 恰好能解决上述问题,其允许开发者指定整个工程的编译流程,在根据编译平台,自动生成本地化的 Makefile

和工程文件,最后用户只需 make 编译即可,所以可以把 CMake 看成一款自动生成 Makefile 的工具,其编译流程如下:

画板

1、蓝色虚线代表 makefile 构建项目过程

2、红色实线表示使用 cmake 构建项目的过程

CMake 有如下优点:

跨平台

能够管理大型项目

简化编译构建过程和编程过程

可扩展:可以为 cmake 编写特定功能的模块,扩充 cmake 功能

2、CMake 的使用

2.1、CMake 工具安装

1、 下载 cmake,官网地址Download CMake。根据系统环境选择相对应的安装包。

双击安装到对应路径,将 bin 的路径添加到环境变量中。

安装完成后,在 cmd 中输入 cmake --version,若显示版本信息,则安装成功;

2、下载 MinGW,下载地址MinGW。

下载完安装包后,双击打开,需安装 C/C++编译器及 mingw32-make。

安装完成后,需将安装目录 MinGW 下 bin 文件下的 mingw32-make.exe 改名成 make.exe。并将该路径添加到系统环境变量中

在 cmd 窗口中输入 gcc -v 及 make -v;若出现相对应的版本号,则代表安装成功;

2.2、CMake 的使用

1、注释

CMake 使用#进行 行注释,可放在任何位置,#[[]] 形式为块注释。

2、单目录工程测试

工程目录下包含文件如下:

1、 源文件编写:

#include <stdio.h>
#include "head.h"int main()
{int a = 5;int b = 10;printf("a = %d, b = %d\n", a, b);printf("a+b = %d\n", add(a, b));return 0;
}
#include <stdio.h>
#include "head.h"int add (int a, int b)
{return a+b;
}
#pragma onceextern int add (int a, int b);

2、 编写 CMakeLists.txt 文件

#CMake最低版本号要求
cmake_minimum_required(VERSION 3.1)
#项目信息
project(demo)
#指定生成目标
add_executable(app main.c;add.c)

CMakeLists.txt 由命令、注释、空格组成,其中命令是不区分大小写。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔;

本例中 CMakeLists.txt 文件的命令详细解释如下:

cmake_minimum_required:指定使用的 cmake 的最低版本(该命令可选,非必须,若不加可能会有警告)

project:定义工程名称,并可指定工程的版本、工程描述、web 主页地址、支持的语言,若这些不需要可忽略,只需指定工程名字即可;

add_executable:定义工程生成一个可执行程序;源文件可以是一个或多个,若有多个可用空格或;间隔。

# 样式1
add_executable(app main.c;add.c)
# 样式2
add_executable(app main.c add.c)

3、 执行 CMake 命令

新建一个 build 文件夹,然后进入 build文件夹下使用 cmake 命令,如下图:

-G 后面指定具体的生成器类型,MinGW 表示 windows,Unix 表示 unix 或 linux 环境下的生成器

DCMAKE_C_COMPILER表示C代码的编译工具,DCMAKE_CXX_COMPILER表示C++代码的编译工具;

“…”表示到上一级目录寻找"CMakeLists.txt",等同于“…/”。

有关生成器详细参见手册:

https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#manual:cmake-generators(7)

build 文件夹下会生成相应的 Makefile 文件,如下图:

4、执行 make 命令

在 build 文件下执行 make 会生成相应的 app.exe 可执行程序;如下图:

3、多目录多文件工程测试

基本所有项目的源文件中都包含多个目录文件,以实现功能代码分层;

如下图工程目录:

src 文件下包含相应函数的.c 文件,inc 文件夹下包含头文件;

1、CMAKE 定义变量

在 cmake 里定义变量需要使用 set

VAR:变量名 VALUE:变量值

2、指定输出的路径

在 cmake 中使用宏 EXECUTABLE_OUTPUT_PATH 指定可执行程序的输出路径:

若该路径中的子目录不存在,会自动生成,无需自己手动创建;

若可执行程序生成路径使用的是相对路径./xxx/xx,那这个路径中的./对应的是 makefile 文件所在的目录

3、搜索文件

若在项目里边的源文件很多,在编写 CMakeLists.txt 文件的时候可以使用 aux_source_directory 命令或者 file

命令搜索文件

aux_source_directory 命令可以查找某个路劲下的所有源文件,命令格式如下:

dir:要搜索的目录

variable:将从 dir 目录下搜索到的源文件列表存储到该变量中

file 命令搜索所有源文件,命令格式如下:

GLOB:将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中;如下例子

在 cmake 中设置要包含的目录可以使用 include_directories 命令:

完整的 CMakeLIsts.txt 文件内容如下:

cmake_minimum_required(VERSION 3.0)
project(test)#添加一个变量指向main.c
set(MAIN main.c)#指定可执行程序输出路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build/bin)#包含头文件
include_directories(${PROJECT_SOURCE_DIR}/inc)#包含源文件
#aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_LIST)
file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/src/*.c)add_executable(app ${SRC_LIST} ${MAIN})

工程中的 build.bat 脚本内容如下:

:: 删除build文件夹,“/S”表示递归删除,“/Q” 表示静默,可通过在cmd下执行“help rmdir”查看参数具体功能
rmdir /S /Q build
mkdir build
cd build:: -G后面指定具体的生成器类型,MinGW表示windows,Unix表示unix或linux环境下的生成器。
:: 有关生成器详细参见手册:  https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html#manual:cmake-generators(7)
:: DCMAKE_C_COMPILER表示C代码的编译工具,DCMAKE_CXX_COMPILER表示C++代码的编译工具;
:: “..”表示到上一级目录寻找"CMakeLists.txt",等同于“../”。
cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ ..:: 在cmake生成了makefile文件,并指定了C/C++源码编译工具后,使用make命令编译makefile定义的工程。
makepause

运行 build.bat 脚本完成程序编译结果如下:

4、制作动态库或静态库

在 cmake 中,若要制作静态库,需要使用的命令如下:

静态库名字分为三部分:lib + 库名字 + .a;如下一个例子目录,需要将 src 目录中的源文件编译成静态库:

根据上面的目录结构,CMakeLists.txt 具体内容如下:

cmake_minimum_required(VERSION 3.0)
project(test)
#包含头文件
include_directories(${PROJECT_SOURCE_DIR}/inc)
#指定静态库输出路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#包含源文件
file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/src/*.c)
#生成静态库
add_library(math STATIC ${SRC_LIST})

最终生成如下对应的静态库文件

在 cmake 中制作动态库,需要使用的命令如下:

以上述目录为例,只要修改下 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.0)
project(test)
#包含头文件
include_directories(${PROJECT_SOURCE_DIR}/inc)
#指定动态库输出路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#包含源文件
file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/src/*.c)
#生成静态库
add_library(math SHARED ${SRC_LIST})
5、包含库文件

1、链接静态库

在 cmake 中,链接静态库的命令如下:

link_libraries(<static lib> [<static lib>...])
参数1:指定出要链接的静态库的名字(全名libxxx.a/可以是去头lib去尾.a之后的名字xxx
参数2:要链接的其它静态库的名字

2、链接动态库

target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <item>... [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
target:指定要加载的库的文件的名字(该文件可能是源文件/动态库/静态库/可执行文件
PRIVATE|PUBLIC|INTERFACE:动态库的访问权限,默认为PUBLIC如果各个动态库之间没有依赖关系,无需做任何设置,三者没有没有区别,一般无需指定,使用默认的 PUBLIC 即可。动态库的链接具有传递性,如果动态库 A 链接了动态库B、C,动态库D链接了动态库A,此时动态库D相当于也链接了动态库B、C,并可以使用动态库B、C中定义的方法。target_link_libraries(A B C)target_link_libraries(D A)
PUBLIC:在public后面的库会被Link到前面的target中,并且里面的符号也会被导出,提供给第三方使用。
PRIVATE:在private后面的库仅被link到前面的target中,并且终结掉,第三方不能感知你调了啥库
INTERFACE:在interface后面引入的库不会被链接到前面的target中,只会导出符号。

动态库的链接和静态库是完全不同的:

静态库会在生成可执行程序的链接阶段被打包到可执行程序中,所以可执行程序启动,静态库就被加载到内存中了。

动态库在生成可执行程序的链接阶段不会被打包到可执行程序中,当可执行程序被启动并且调用了动态库中的函数

的时候,动态库才会被加载到内存

因此,在cmake中指定要链接的动态库的时候,应该将命令写到生成了可执行文件之后;

2.3、CMake 基本命令

1、日志命令

在 CMake 中可以用用户显示一条消息,该命令的名字为 message:

(无):重要消息

STATUS:非常重要消息

WARNING:CMake 警告,会继续执行

AUTHOR_WARNING:CMake 警告(dev),会继续执行

SEND_ERROR:CMake 错误,继续执行,但是会跳过生成的步骤

FATAL_ERROR:CMake 错误,终止所有处理过程

CMake 的命令工具会在 stdout 上显示 STATUS 消息,在 stderr 上显示其他所有消息,CMake 的 GUI 会在它的 log

区域显示所有消息。如下所示:

#CMake最低版本号要求
cmake_minimum_required (VERSION 2.8)
#项目信息
project (demo)message(STATUS "source path: ${PROJECT_SOURCE_DIR}")message(WARNING "source path: ${PROJECT_SOURCE_DIR}")message(FATAL_ERROR "source path: ${PROJECT_SOURCE_DIR}")

2、变量操作

cmake 语法中有两种方法可以用来追加变量,set/list。

使用 set 拼接,对应的命令格式如下:

上面的命令其实就是将从第二个参数开始往后所有的字符串进行拼接,最后将结果存储到第一个参数中

若第一个变量参数中原本有数据会对原数据进行覆盖。示例如下:

cmake_minimum_required(VERSION 3.0)
project(test)
set (TEMP "hello,cmake")
file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/src/*.c)
#追加(拼接)
set(SRC_LIST ${SRC_LIST} ${TEMP})
message(STATUS "message: ${SRC_LIST}")

使用 list 进行字符串拼接,对应的命令格式如下:

对于 list 命令的功能比 set 要强大,字符串拼接只是它子功能之一。

APPEND 表示数据追加,后边的参数和 set 就一样;示例如下:

cmake_minimum_required(VERSION 3.0)
project(test)
set (TEMP "hello,cmake")
file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/src/*.c)
#追加(拼接)
list(APPEND SRC_LIST ${SRC_LIST} ${TEMP})
message(STATUS "message: ${SRC_LIST}")

list 命令的字符串移除,对应的命令格式如下:

示例如下:

cmake_minimum_required(VERSION 3.0)
project(test)
set (TEMP "hello,cmake")
file(GLOB SRC_LIST ${PROJECT_SOURCE_DIR}/src/*.c)
#移除前日志
message(STATUS "message: ${SRC_LIST}")
#移除 sub.c
list(REMOVE_ITEM SRC_LIST ${PROJECT_SOURCE_DIR}/src/sub.c)
#移除后日志
message(STATUS "message: ${SRC_LIST}")

关于 list 命令还有其它功能,如下:

1、获取list长度
list(LENGTH <list> <output variable>)
LENGTH:子命令LENGTH用于读取列表长度 
<list>当前操作列表 
<output variable>新创变量,用于存储列表长度2、读取列表中指定索引的元素,可以指定多个索引
list(GET <list> <element index> [<element index> ...] <output variable>)
<list>当前操作列表
<element index>:列表元素的索引
从0开始编号,索引0的元素为列表中的第一个元素;
索引也可以是负数,-1表示列表的最后一个元素,-2表示列表倒数第二个元素,以此类推
当索引(不管是正还是负)超过列表的长度,运行会报错
<output variable>:新创建的变量,存储指定索引元素的返回结果,也是一个列表3、将列表中的元素用连接符(字符串)连接起来组成一个字符串
list (JOIN <list> <glue> <output variable>)
<list>:当前操作的列表
<glue>:指定的连接符(字符串)
<output variable>:新创建的变量,存储返回的字符串4、查找列表是否存在指定的元素,若未找到,返回-1
list(FIND <list> <value> <output variable>)
<list>:当前操作的列表
<value>:需要再列表中搜索的元素
<output variable>:新创建的变量
如果列表<list>中存在<value>,那么返回<value>在列表中的索引
如果未找到则返回-1。5、将元素追加到列表中
list (APPEND <list> [<element> ...])6、在list中指定的位置插入若干元素
list(INSERT <list> <element_index> <element> [<element> ...])7、将元素插入到列表的0索引位置
list (PREPEND <list> [<element> ...])8、将列表中最后元素移除
list (POP_BACK <list> [<out-var>...])9、将列表中第一个元素移除
list (POP_FRONT <list> [<out-var>...])10、将指定的元素从列表中移除
list (REMOVE_ITEM <list> <value> [<value> ...])11、将指定索引的元素从列表中移除
list (REMOVE_AT <list> <index> [<index> ...])12、移除列表中重复元素
list (REMOVE_DUPLICATES <list>)13、列表翻转
list(REVERSE <list>)14、列表排序
list (SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])
COMPARE:指定排序方法。有如下几种值可选:STRING:按照字母顺序进行排序,为默认的排序方法FILE_BASENAME:如果是一系列路径名,会使用basename进行排序NATURAL:使用自然数顺序排序CASE:指明是否大小写敏感。有如下几种值可选:SENSITIVE: 按照大小写敏感的方式进行排序,为默认值INSENSITIVE:按照大小写不敏感方式进行排序ORDER:指明排序的顺序。有如下几种值可选:ASCENDING:按照升序排列,为默认值DESCENDING:按照降序排列
3、宏定义

CMake 中常用的宏如下:

PROJECT_SOURCE_DIR 使用cmake命令后紧跟的目录,一般是工程的根目录

PROJECT_BINARY_DIR 执行cmake命令的目录

CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径

CMAKE_CURRENT_BINARY_DIR target 编译目录

EXECUTABLE_OUTPUT_PATH 重新定义目标二进制可执行文件的存放位置

LIBRARY_OUTPUT_PATH 重新定义目标链接库文件的存放位置

PROJECT_NAME 返回通过PROJECT指令定义的项目名称

CMAKE_BINARY_DIR 项目实际构建路径,假设在build目录进行的构建,那么得到的就是这个目录的路径

在 CMake 中可以使用命令 add_definitions 添加代码中的宏定义,如下一段代码:

#include <stdio.h>#define NUMBER          3   int main()
{int a = 10;
#ifdef DEBUGprintf("这是一个测试打印...\n");
#endiffor(int i = 0; i < NUMBER; ++i){printf("hello, GCC!\n");}return 0;
}

对于上面的源文件编写的 CMakeLists.txt,内容如下:

cmake_minimum_required(VERSION 3.0)
project(test)
#添加自定义宏
add_definitions(-DDEBUG)
add_executable(app ./main.c)

通过上述这种方式,上述代码中的第八行日志就能够被输出出来;

相关文章:

CMake基础介绍

1、CMake 概述 CMake 是一个项目构建工具&#xff0c;并且是跨平台的&#xff1b;关于项目构建目前比较流行的还有 Makefile(通过 Make 命令进行项目的构建)&#xff0c; 大多 IDE 软件都集成了 make,比如&#xff1a;VS 的 nmake、linux 下的 GNU make、Qt 的 qmake 等&…...

偷钱包行为检测数据集VOC+YOLO格式922张1类别有增强

有320张图片是原图剩余为增强图片 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;922 标注数量(xml文件个数)&#xff1a;922 标注数量…...

C 语言比较运算符:程序如何做出“判断”?

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 在编写程序时,我们经常需要根据不同的条件来执行不同的代码。比如,如果一个分数大于 60 分,就判断为及格;如果用户的年龄小于 18 岁,就禁止访问某个内容等等。这些“判断”的核心,就依赖于程序能够比…...

Webug4.0靶场通关笔记16- 第20关文件上传(截断上传)

目录 第20关 文件上传(截断上传) 1.打开靶场 2.源码分析 &#xff08;1&#xff09;右键查看前端源码 &#xff08;2&#xff09;服务端源码分析 &#xff08;3&#xff09;渗透思路 3.渗透实战 &#xff08;1&#xff09;构建脚本 &#xff08;2&#xff09;bp抓包 …...

10 种最新的思维链(Chain-of-Thought, CoT)增强方法

防御式链式思维&#xff08;Chain-of-Defensive-Thought&#xff09; 该方法通过引入结构化、防御性的推理示例&#xff0c;提高大语言模型在面对被污染或误导信息时的稳健性。 &#x1f4c4; 论文链接&#xff1a;https://arxiv.org/abs/2504.20769 混合链式思维&#xff08;…...

力扣119题解

记录 2025.5.5 题目&#xff1a; 思路&#xff1a; 代码: class Solution {public List<Integer> getRow(int rowIndex) {List<Integer> row new ArrayList<Integer>();row.add(1);for (int i 1; i < rowIndex; i) {row.add((int) ((long) row.get(i…...

NSOperation深入解析:从使用到底层原理

1. 基础概念与使用 1.1 NSOperation概述 NSOperation是Apple提供的一个面向对象的并发编程API&#xff0c;它基于GCD&#xff08;Grand Central Dispatch&#xff09;构建&#xff0c;但提供了更高层次的抽象和更丰富的功能。NSOperation允许开发者以面向对象的方式管理并发任…...

suna工具调用可视化界面实现原理分析(二)

这是一个基于React的浏览器操作可视化调试组件&#xff0c;主要用于在AI开发工具中展示网页自动化操作过程&#xff08;如导航、点击、表单填写等&#xff09;的执行状态和结果。以下是关键技术组件和功能亮点的解析&#xff1a; 一、核心功能模块 浏览器操作状态可视化 • 实时…...

【大模型面试每日一题】Day 9:BERT 的 MLM 和 GPT 的 Next Token Prediction 有什么区别?

【大模型面试每日一题】Day 9&#xff1a;BERT 的 MLM 和 GPT 的 Next Token Prediction 有什么区别&#xff1f; &#x1f4cc; 题目重现 &#x1f31f; 面试官&#xff1a;预训练任务中&#xff0c;BERT 的 MLM&#xff08;Masked Language Modeling&#xff09;和 GPT 的 …...

分析strtol(),strtoul()和strtod()三个函数的功能

字符串转换为数值部分和子字符串首地址的函数有strtol(),strtoul()和strtod()三个函数。 1、strtol()函数 long int strtol(const char *str, char **endptr, int base) //当base0时,若字符串不是以"0","0x"和"0X"开头,则将数字部分按照10进制…...

Spring Boot 加载application.properties或application.yml配置文件的位置顺序。

我换一种更通俗易懂的方式&#xff0c;结合具体例子来解释 Spring Boot 加载application.properties或application.yml配置文件的位置顺序。 生活场景类比 想象你要找一本书&#xff0c;你有几个可能存放这本书的地方&#xff0c;你会按照一定顺序去这些地方找&#xff0c;直…...

C++进阶之——多态

1. 多态的概念 多态是用来描述这个世界的 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。 这里就很厉害了&#xff0c;能够实现特殊处理&#xff0c;本文章就是来仔细…...

第13项三期,入组1123例:默沙东启动TROP2 ADC+PD-1子宫内膜癌头对头临床

Umabs DB作为目前全球最全面的抗体药物专业数据库&#xff0c;收录全球近10000个从临床前到商业化阶段抗体药物&#xff0c;涉及靶点1600&#xff0c;涉及疾病种类2400&#xff0c;研发机构2900&#xff0c;覆盖药物蛋白序列、专利和临床等多种专业信息。Umabs DB药物数据库已正…...

政务服务智能化改造方案和案例分析

政务服务智能化改造方案和案例分析 一、引言 在数字化时代浪潮的推动下&#xff0c;政务服务智能化改造已成为提升政府服务效能、优化营商环境、增强民众满意度的关键举措。传统政务服务模式存在流程繁琐、信息孤岛、办理效率低等问题&#xff0c;难以满足现代社会快节奏发展和…...

15.日志分析入门

日志分析入门 第一部分&#xff1a;日志分析基础第二部分&#xff1a;日志分析方法与工具第三部分&#xff1a;日志分析实践总结 目标&#xff1a; • 理解日志分析在网络安全中的作用 • 掌握日志的基本类型和分析方法 • 通过实践初步体验日志分析的过程 第一部分&#xff…...

EPSG:3857 和 EPSG:4326 的区别

EPSG:3857 和 EPSG:4326 是两种常用的空间参考系统&#xff0c;主要区别在于坐标表示方式和应用场景。以下是它们的核心差异&#xff1a; 1. 坐标系类型 EPSG:4326&#xff08;WGS84&#xff09; 地理坐标系&#xff08;Geographic Coordinate System&#xff09;&#xff0c;基…...

Python Cookbook-7.2 使用 pickle 和 cPickle 模块序列化数据

任务 你想以某种可以接受的速度序列化和重建Python 数据结构&#xff0c;这些数据既包括基本Python 对象也包括类和实例。 解决方案 如果你不想假设你的数据完全由基本 Python 对象组成&#xff0c;或者需要在不同的 Python 版本之间移植&#xff0c;再或者需要将序列化后的…...

Java学习手册:Spring 多数据源配置与管理

在实际开发中&#xff0c;有时需要连接多个数据库&#xff0c;例如&#xff0c;一个系统可能需要从不同的数据库中读取和写入数据。Spring 提供了多种方式来配置和管理多数据源&#xff0c;以下将介绍常见的配置和管理方法。 一、多数据源配置 在 Spring 中&#xff0c;可以通…...

六、shell脚本--正则表达式:玩转文本匹配的“万能钥匙”

想象一下&#xff0c;你需要在一大堆文本&#xff08;比如日志文件、配置文件、网页代码&#xff09;里查找符合某种特定模式的字符串&#xff0c;而不是仅仅查找固定的单词。比如说&#xff1a; 找出所有的电子邮件地址 &#x1f4e7;。找到所有看起来像电话号码 &#x1f4d…...

Gradio全解20——Streaming:流式传输的多媒体应用(4)——基于Groq的带自动语音检测功能的多模态Gradio应用

Gradio全解20——Streaming&#xff1a;流式传输的多媒体应用&#xff08;4&#xff09;——基于Groq的带自动语音检测功能的多模态Gradio应用 本篇摘要20. Streaming&#xff1a;流式传输的多媒体应用20.4 基于Groq的带自动语音检测功能的多模态Gradio应用20.4.1 组件及配置1.…...

力扣hot100 (除自身以外数组的乘积)

238. 除自身以外数组的乘积 中等 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除…...

LFU算法解析

文章目录 LFU缓存中关键变量的访问与更新机制1. min_freq - 最小频率访问时机更新时机更新示例 2. capacity - 缓存容量访问时机更新时机访问示例 3. key_to_node - 键到节点的映射访问时机更新时机更新示例 4. freq_to_dummy - 频率到链表哑节点的映射访问时机更新时机更新示例…...

RHCSA笔记2

RHCSA基础命令 &#xff08;一&#xff09;命令格式 &#xff08;1&#xff09;命令名【选项】【参数】 选项&#xff1a;决定命令执行的方式&#xff0c;通常有个-或--开头 参数&#xff1a;决定命令作用的目标&#xff08;目录&#xff0c;文件&#xff0c;磁盘&#xff…...

JavaSE核心知识点01基础语法01-02(基本数据类型、运算符、运算符优先级)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点01基础语法01-02&#xff0…...

FOC算法开环控制基础

1. 为什么要有FOC算法 先看看从有刷电机到无刷电机的简单介绍&#xff0c;如下图1&#xff0c;通电螺线圈会产生磁场&#xff0c;这个磁场会产生N级和S级&#xff0c;然后这个电磁铁就可以吸引永磁体&#xff0c;S级吸引N级&#xff0c;N级吸引S级&#xff0c;通俗的来说&…...

进程间通信——管道

概念 进程间通信&#xff08;Inter-Process Communication&#xff0c;简称 IPC&#xff09;是指在不同进程之间进行数据交换和信息传递的机制。它的目的主要有4种&#xff1a; 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间…...

五一作业-day02

文章目录 1. 每日基操2. 模拟故障2.1 **remove regular empty file 是否删除普通文件(空的)?**2.2 **is a directory xxx是一个目录**2.3 **xxx not a directory 不是一个目录**2.4 Cant open file for writing2.5 **No write since last change** 3. 习题4. **进阶习题** 1. …...

Springclound常用五大组件及其使用原理

注册中心Eureka Eureka-Server&#xff1a;就是服务注册中心&#xff08;可以是一个集群&#xff09;&#xff0c;对外暴露自己的地址。 提供者&#xff1a;启动后向Eureka注册自己信息&#xff08;地址&#xff0c;服务名称等&#xff09;&#xff0c;并且定期进行服务续约 …...

Qt 显示QRegExp 和 QtXml 不存在问题

QRegExp 和 QtXml 问题 在Qt6 中 已被弃用&#xff1b; 1&#xff09;QRegExp 已被弃用&#xff0c;改用 QRegularExpression Qt5 → Qt6 重大变更&#xff1a;QRegExp 被移到了 Qt5Compat 模块&#xff0c;默认不在 Qt6 核心模块中。 错误类型解决方法QRegExp 找不到改用 Q…...

开元类双端互动组件部署实战全流程教程(第4部分:后台配置系统与参数动态控制)

作者&#xff1a;曾经因为后台配置写错&#xff0c;导致全服进不去房的工程师 组件附带的后台管理系统为 PHP 编写&#xff0c;界面简洁但功能齐全。具备完整的模块划分与权限体系&#xff0c;支持动态参数下发、日志审计、行为数据统计等。 七、前端后台交互流程图与代码示例 …...

MySQL基础关键_008_DDL 和 DML(一)

目 录 一、DDL 1.创建表 &#xff08;1&#xff09;语法格式 &#xff08;2&#xff09;实例 2.查看建表语句 &#xff08;1&#xff09;语法格式 &#xff08;2&#xff09;实例 3.修改表名 &#xff08;1&#xff09;语法格式 &#xff08;2&#xff09;实例 4.新…...

基于SpringBoot + Vue 的火车票订票系统

包含&#xff1a; [1]源码✔ 数据库文件✔ [2]万字文档✔ [3]视频与图文配置教程✔ 功能描述&#xff1a; 本系统包含管理员、用户两个角色。 管理员&#xff1a;用户管理、新闻公告管理、车辆管理、车站及路线管理、留言建议管理、车次信息管理 用户&#xff1a;购票操作、查…...

飞致云开源社区月度动态报告(2025年4月)

自2023年6月起&#xff0c;中国领先的开源软件公司飞致云以月度为单位发布《飞致云开源社区月度动态报告》&#xff0c;旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况&#xff0c;以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源运营数据概览&…...

解决跨域的4种方法

00_跨域的概念 浏览器只允许请问具有相同的协议&#xff0c;域名&#xff0c;端口&#xff0c;进行请求&#xff0c;有一个不同&#xff0c;就会拒绝。 01.前后端协商jsonp //jsonp//jsonp 是 json with padding 的缩写&#xff0c;是一种通过 <script> 标签的 src 属性…...

C# 方法(局部函数和参数)

本章内容: 方法的结构 方法体内部的代码执行 局部变量 局部常量 控制流 方法调用 返回值 返回语句和void方法 局部函数 参数 值参数 引用参数 引用类型作为值参数和引用参数 输出参数 参数数组 参数类型总结 方法重载 命名参数 可选参数 栈帧 递归 局部函数 正如刚刚所解释的&…...

kotlin 02flow-sharedFlow 完整教程

一 sharedFlow是什么 SharedFlow 是 Kotlin 协程中 Flow 的一种 热流&#xff08;Hot Flow&#xff09;&#xff0c;用于在多个订阅者之间 共享事件或数据流。它适合处理 一次性事件&#xff08;如导航、弹窗、Toast、刷新通知等&#xff09;&#xff0c;而不是持续状态。 ✅ …...

数据库原理——E-R图的极速省流理解 例题解析

前言 数据库一节没听&#xff0c;一个小时看书给我大致看懂了 E-R概念模型极速省流版 E-R图的重点&#xff1a; 关系图&#xff0c;三要素——实体、属性、联系 图形标识——矩形、椭圆形、菱形 1.实体和属性也可以放一个框矩形框 2.菱形两层边&#xff1a;弱实体集的联…...

5.4 - 5.5Web基础+c语言拓展功能函数

StringBoot HTTP协议&#xff1a; 规定了浏览器与服务器之间数据传递的规则。 请求协议&#xff1a; 请求数据格式&#xff1a; 请求头和请求体之间有一个空行隔开 响应协议&#xff1a; 响应数据格式&#xff1a; 响应头和响应体之间存在空行隔开。 响应数据设置&#xff1…...

Java抽象类与接口详解

一、抽象类(Abstract Class) 1. 定义与基本使用 // 抽象类定义 public abstract class Animal {// 抽象方法(无实现)public abstract void makeSound();// 具体方法(有实现)public void sleep() {System.out.println("动物在睡觉");} }// 继承抽象类 class Dog ext…...

网络延时 第四次CCF-CSP计算机软件能力认证

就是求树的直径: 思路&#xff1a;函数代表当前根节点的最长距离 然后遍历保存当前树的所有孩子的最长距离 和次长距离 如果是叶子节点就返回0 在每次获得每个节点的次长距离和最长距离就更新全局直径 最后获得最长距离 Ac代码: #include <bits/stdc.h> using namespa…...

【C++进阶十】多态深度剖析

【C进阶十】多态深度剖析 1.多态的概念及条件2.虚函数的重写3.重写、重定义、重载区别4.C11新增的override 和final5.抽象类6.虚表指针和虚表6.1什么是虚表指针6.2指向谁调用谁&#xff0c;传父类调用父类&#xff0c;传子类调用子类 7.多态的原理8.单继承的虚表状态9.多继承的…...

网络传输中字节序

在小端字节序主机发送数据 0x1234 的情况下,(单字节没有字节序)我们可以分步骤来分析接收端如何解析这个数据: 1. 小端字节序主机的存储方式 在小端字节序中,低地址存储低字节,高地址存储高字节。 数据 0x1234 的字节表示为: 低字节:0x34 高字节:0x12 因此,在小端字…...

前端- ElementPlus入门

1.介绍 Element&#xff1a;是饿了么公司前端开发团队提供的一套基于 Vue3 的网站组件库&#xff0c;用于快速构建网页。 Element 提供了很多组件供我们使用。例如 超链接、按钮、图片、表格等等。 官方网站&#xff1a;一个 Vue 3 UI 框架 | Element Plus 2.步骤 1.安装E…...

AI Agent 要用到的技术

AI 发展是大趋势&#xff0c;以下是目前要用到的一些技术项 不论你从事哪个方向&#xff0c;这个技术栈都有必要学习 LangChainTransformersMicrosoft Semantic KernelLangflowLangGrphLangSmith 学习网站 以下是 LangChain、Transformers、Microsoft Semantic Kernel 的学习…...

# 从零构建一个简单的卷积神经网络:手写数字识别

从零构建一个简单的卷积神经网络&#xff1a;手写数字识别 在深度学习的世界里&#xff0c;卷积神经网络&#xff08;CNN&#xff09;是处理图像数据的强大工具。今天&#xff0c;我们将通过一个简单的例子&#xff0c;从零开始构建一个CNN模型&#xff0c;用于手写数字识别。…...

【RK3588嵌入式图形编程】-Cairo-Cairo图形库支持后端

Cairo图形库支持后端 文章目录 Cairo图形库支持后端1、PNG图像后端2、PDF文件后端3、SVG文件后端4、GTK窗口支持Cairo库支持多种后端。在本文中,我们使用Cairo创建PNG图像、PDF文件、SVG文件,并在GTK窗口上绘制。 1、PNG图像后端 在第一个示例中,我们创建一个 PNG 图像。 …...

LCD,LED

本文来源 &#xff1a; 腾讯元宝 LCD(Liquid Crystal Display)液晶显示器 LCD本身并不能发光&#xff0c;而是控制光的传输。 LCD内充满了棒状的液态分子&#xff08;液晶&#xff09;&#xff0c;这些分子可以形成扭转的螺旋线&#xff0c;弯曲来自显示器背后光源产生的光线或…...

HTML 元素

什么是 HTML 元素&#xff1f; HTML 元素&#xff08;Element&#xff09;是构成 HTML 文档的基本单位&#xff0c;它由开始标签、内容和结束标签组成&#xff0c;用于定义网页的结构和内容。元素是 HTML 标记语言的核心概念&#xff0c;每个元素都有特定的语义和用途。 元素…...

(undone) MIT6.S081 2023 学习笔记 (Day11: LAB10 mmap)

url: https://pdos.csail.mit.edu/6.1810/2023/labs/mmap.html 任务0&#xff1a;讲义如下 (完成) mmap和munmap系统调用允许UNIX程序对其地址空间进行精细控制。它们可用于进程间共享内存、将文件映射到进程地址空间&#xff0c;并作为用户级页面错误处理方案的一部分&#x…...

7400MB/s5050TBW完美结合,全新希捷酷玩530R SSD体验评测

7400MB/s&5050TBW完美结合&#xff0c;全新希捷酷玩530R SSD体验评测 哈喽小伙伴们好&#xff0c;我是Stark-C~ 说到希捷酷玩530 SSD&#xff0c;很多硬核进阶玩家应该都知道&#xff0c;或者说正在使用&#xff08;比如说我~&#xff09;。 作为希捷大厂旗下高性能SSD的…...