CMake简明教程 笔记
推荐B站视频:1.1 Cmake构建项目的流程_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1xa4y1R7vT?p=1&vd_source=a934d7fc6f47698a29dac90a922ba5a3
>>目录
1)CMake初体验
- CMake构建流程
- Windows下使用CMake构建项目
- Linux下使用CMake构建项目
2)CMake语法
- 概述以及如何打印
- 变量操作set、list
- 流程控制
- 函数
- 作用域
- 宏
3)CMake构建项目的四种方式
- 直接写入源码路径的方式
- 调用cmake脚本的方式
- CMakeLists嵌套
- Object Libraries
4)CMake与静态库和动态库
- 如何生成静态库和动态库
- CMake如何调用静态库与动态库
5)CMake与源文件交互
实例展示
6)CMake条件编译
实例展示
第一章 CMake初体验
第一节:CMake是什么,CMake构建项目的流程
- CMake是一个开源的、跨平台的自动化构建工具,通过CMake我们可以轻松地
管理我们的项目,注意:
- CMake 并不是包管理工具!
- CMake 并不只支持C/C++
- 掌握CMake是学习C++必经之路
CMake的优点和缺点
- 优点:
- 操作透明而细腻
- 它专注于现代C++现代化,专注于支持C++现代编译器和工具链
- 真正的跨平台,支持比如Windows、Linux、MacOS,Cygwin(Linux移植到Windows)等
- 支持生成几乎所有主流IDE的项目
- 缺点:
- 它还在成长
- CMake它是一门语言,你需要学习
CMake严重阻碍了C++的发展吗???
CMake没有阻碍C++的发展,相反CMake拯救了C++!相比其他语言的构建工具,CMake自然要复杂的多,但这不是CMake的问题,相比其他的编程语言,C/C++更关注底层和构建其他的编程语言,C/C++更关注底层和构建其他的编程语言,因此CMake面临的问题和其他编程语言是完全不同的!而且正因为CMake的出现,C++才终于完成了项目跨平台!
C/C++源文件是怎么生成可执行程序
>>toolchain流程
- 预处理(-E参数 宏替换等)
- 编译 gcc/msvc/clang(-S参数)
- 汇编(-C参数 linux生成.o文件、windows生成.obj文件)
- 连接(将多个二进制文件连接生成一个可执行的文件)
CMake与Makefile、Make的关系
- Makefile并不是跨平台,CMake会根据编译器的类型来决定是否生成Makefile,大多数情况下CMake会生成Makefile
- 大型项目不推荐大家手动编写Makefile
- CMake工具(类似批处理工具)是通过调用makefile文件中的命令实现编译和链接的
CMake 命令行执行流程
1.编写CMakeLists.txt文件,下面是最基本的配置
- cmake_minimum_required(VERSION 3.20) #最小版本
- project(Hello)#项目名
- add_executable(Hello main.cpp)#生成可执行文件
2.cmake -B build(默认MSVC) / cmake -B build -G "MinGW Makefiles"(选择MinGW)
- 创建一个build并在此目录下生成makefile或其他文件
3.cmake --build build
- 生成项目
第二节:Windows下用CMake构建项目
- Windows下的CMake安装
- 官网下载CMake
- https://cmake.org/download/
Windows下的build system generator
- 默认MSVC(vs2022与vs2019)
- 可以安装 MinGW(gcc与clang)
- cmake参数:cmake -G <generator-name> -T <toolset-spec> -A <platform-name><path-to-source>
- 通过指定-G "MinGW Makefiles"来指定cmake使用gcc
通过例子来
- 给大家演示一下在windows下用cmake构建项目
第三节:Linux下使用CMake构建项目
- Linux下安装CMake
- sudo apt-get install cmake
- 源码安装
- 推荐源码安装,感受一下C++的编译速度
>>源码安装
sudo apt-get install build-essentialsudo wget https://cmake.org/files/v3.28/cmake-3.28.0.tar.gztar -zxvf cmake-3.28.0.tar.gzcd cmake-3.28.0./configuresudo makesudo make installcmake --version 检查是否安装成功
通过例子来
- 如何在linux下使用CMake
第二章 CMake语法
第一节:CMake Language概述
- CMake项目是基于CMakeLists.txt构建的,在CMakeLists.txt中(或者是*.cmake)我们用到的是CMake Language
- CMake Language的语法非常像一些命令式编程语言
- 执行从源树(CMakeLists.txt)的根文件开始
CMake命令行工具是由五个可执行文件构成
cmakectestcpackcmake-guiccmake
如果不通过CMakeLists.txt,运行CMake
- cmake -P *.cmake
- 以上用法很少在项目中用到,但适合学习CMake语法
- first.cmake
cmake_minimum_required(VERSION 3.28.0)
message("hello")
message(hello)
message("asfdfas
jiko")
message([[asasdsa
fdgh]])# 获取CMAKE中的信息
# ${}
message(${CMAKE_VERSION})
执行结果:
cmd cmake 3.28.1 7ms
asasdsa
fdgh
3.28.1
第二节:变量操作 set、list
- CMake中的变量分为两种
- CMake提供
- 自定义
- CMake变量的命名区分大小写
- CMake中的变量在存储时都是字符串
- CMake获取变量:${变量名}
- 变量的基础操作是set()与unset().但你也可以用list或是string操作变量
Set方法
- set(<variable><value>...[PARENT_SCOPE])
- set可以给一个变量设置多个值
- 变量内部存储时使用";"分割,但显示时只进行连接处理
List方法
- list(APPEND <list> [<element>...]) 列表添加元素
- list(REMOVE_ITEM <list> <value> [value...]) 列表删除元素
- ist(LENGTH <list> <output variable>) 获取列表元素个数
- list(FIND <list> <value> <out-var>) 在列表中查找元素返回索引
- list(INSERT <list> <index> <element>...) 在index位置插入
- list(REVERSE <list>) 反转list
- list(SORT <list>[...]) 排序list
list.cmake
cmake_minimum_required(VERSION 3.28.0)# 两种方式来常见Var
set(LISTVALUE a1 a2 a3)
message(${LISTVALUE})List(APPEND port p1 p2 p3)
message(${port})# 获取长度
list(LENGTH LISTVALUE len)
message(${len})list(FIND LISTVALUE "a2" index)
message(${index})list(REMOVE_ITEM port p1)
message(${port})list(APPEND LISTVALUE a5)
message(${LISTVALUE})list(INSERT LISTVALUE 3 a4)
message(${LISTVALUE})list(REVERSE LISTVALUE)
message(${LISTVALUE})list(SORT LISTVALUE)
message(${LISTVALUE})
执行结果:
cmd cmake 3.28.1 48ms
╭─ 15:56:45 | 27 Jan, Saturday | in D: Work cmake
╰─❯ cmake -P list.cmake
a1a2a3
1
p2p3
a1a2a3a5
a1a2a3a4a5
a5a4a3a2a1
a1a2a3a4a5
第三节:流程控制
- if条件流程控制
- loop循环流程控制
- break
- continue
条件IF
if(<condition>)<commands>elseif(<condition>)<commands>else() <commands>endif()
通过例子来
- CMake中的流程控制中的条件语句的用法
if.cmake
set(VARBOOL TRUE)
if(NOT VARBOOL)message(TRUE)
else()message(FALSE)
endif()if(1 LESS 2) message("1 LESS 2")
endif()if("ok" LESS 234) message("OK is less")
endif()if(2 EQUAL "2") message("2 EQUAL 2")
endif()
执行结果:
cmd cmake 3.28.1 51ms
╭─ 16:04:00 | 27 Jan, Saturday | in D: Work cmake
╰─❯ cmake -P if.cmake
FALSE
1 LESS 2
2 EQUAL 2
循环LOOP
- Forforeach(<loop_var> RANGE <max>)<commands>endforeach()foreach(<loop_var>RANGE<min><max>[<step>])foreach(<loop_variable>IN[LISTS<lists>][ITEMS<items>])- whilewhile(<condition>)<commands>endwhile()
例子演示:
for.cmake
cmake_minimum_required(VERSION 3.28.0)foreach(VAR RANGE 3) message(${VAR})
endforeach()
message("===============")set(MY_LIST 1 2 3)foreach(VAR IN LISTS MY_LIST ITEMS 4 f) message(${VAR})
endforeach()message("==================")
# zip
set(L1 one two three four five)
set(L2 1 2 3 4 5)foreach(num IN ZIP_LISTS L1 L2) message("word = ${num_0}, num = ${num_1}")
endforeach()
执行过程:
cmd cmake 3.28.1 52ms
╭─ 16:09:16 | 27 Jan, Saturday | in D: Work cmake
╰─❯ cmake -P for.cmake
0
1
2
3
===============
1
2
3
4
f
==================
word = one, num = 1
word = two, num = 2
word = three, num = 3
word = four, num = 4
word = five, num = 5
第四节:函数
- 定义函数的语法
function(<name>[<argument>...])<commands>endfunction()
演示:
func.cmake
cmake_minimum_required(VERSION 3.28.0)function(MyFunc FirstArg) message("MyFunc Name: ${CMAKE_CURRENT_FUNCTION}")message("First Argument: ${FirstArg}") # 第一个参数set(FirstArg "New Value") # 修改第一个参数的值message("First Argument: ${FirstArg}") # 输出修改后的值message("ARGV0 ${ARGV0}")message("ARGV1 ${ARGV1}")message("ARGV2 ${ARGV2}")
endfunction() set(FirstArg "first value")
MyFunc(${FirstArg} "value")
message("First Argument: ${FirstArg}") # 输出修改后的值
执行结果:
cmd cmake 3.28.1 51ms
╭─ 16:11:47 | 27 Jan, Saturday | in D: Work cmake
╰─❯ cmake -P func.cmake
MyFunc Name: MyFunc
First Argument: first value
First Argument: New Value
ARGV0 first value
ARGV1 value
ARGV2
First Argument: first value
第五节:Scope作用域
CMake 有两种作用域
- Function scope 函数作用域
- Directory scope 当从add_subdirectory()命令执行嵌套目录中的CMakeLists.txt列表文件时,注意父CMakeLists.txt其中的变量可以被子CMakeLists.txt使用
CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(scope)function(OutFunc)message("-> Out: ${Var}") set(Var 2) InFunc()message("<- Out: ${Var}")
endfunction()function(InFunc)message("-> In: ${Var}")set(Var 3)message("<- In: ${Var}")
endfunction()set(Var 1)
message("-> Global: ${Var}")
OutFunc()
message("<- Global: ${Var}")
执行命令:cmake -B build -G "MinGW Makefiles",查看执行结果
cmd cmake 3.28.1 77ms
╭─ 16:16:09 | 27 Jan, Saturday | in D: Work cmake scope
╰─❯ cmake -B build -G "MinGW Makefiles"
-- The C compiler identification is GNU 13.2.0
-- The CXX compiler identification is GNU 13.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/mingw64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-> Global: 1
-> Out: 1
-> In: 2
<- In: 3
<- Out: 2
<- Global: 1
-- Configuring done (2.4s)
-- Generating done (0.0s)
-- Build files have been written to: D:/Work/cmake/scope/build
第六节:宏
- CMake中的宏
macro(<name>[<argument>...])<commands>endmacro()
注意:尽量不要写宏,只要会读就好
演示:
cmake_minimum_required(VERSION 3.28.0)macro(Test myVar)set(myVar "new value") #创建了一个新的myVar变量message("argument : " ${myVar})
endmacro()set(myVar "First value")
message("myVar: ${myVar}")
Test("value")
message("myVar: ${myVar}")
执行结果:
cmd cmake 3.28.1 7ms
╭─ 16:20:42 | 27 Jan, Saturday | in D: Work cmake
╰─❯ cmake -P macro.cmake
myVar: First value
argument : value
myVar: new value
第三章 CMake 构建项目的四种方式
第一节:直接写入源码路径的方式
- add_excutable中直接写入相对路径
- 在源码中引入头文件时候需要写相对路径
第二节:调用子目录cmake脚本的方法
- include方法可以引入子目录中的cmake后缀的配置文件
- 将配置加入add_executable中
animal文件夹下有dog.h,cat.h,dog.cpp,cat.cpp,animal.cmake
- dog.h
#pragma once
#include <string>
class Dog{
public:std::string barking();
};
- dog.cpp
#include "dog.h"std::string Dog::barking()
{return "dog wang wang wang";
}
- cat.h
#pragma once
#include <string>
class Cat{
public:std::string barking();
};
- cat.cpp
#include "cat.h"std::string Cat::barking()
{return "cat miao miao miao";
}
- animal.cmake
set(animal_source animal/dog.cpp animal/cat.cpp)
- main.cpp
#include <iostream>
#include "animal/dog.h"
#include "animal/cat.h"
using namespace std;
int main(int argc,char const* argv[]) {Dog dog;std::cout<<dog.barking()<<std::endl;Cat cat;std::cout<<cat.barking()<<std::endl;return 0;
}
- CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(Dog)
include(animal/animal.cmake)
message(${animal_source})
add_executable(app main.cpp ${animal_source})
执行结果:
PS D:\Work\cmake\build> ."D:/Work/cmake/build/app.exe"
dog wang wang wang
cat miao miao miao
PS D:\Work\cmake\build>
第三节:CMakeLists嵌套
- target_include_directories 头文件目录的声明
- target_link_libraries 链接库
- add_subdirectory 添加子目录
- add_library 生成库文件
- 默认 STATIC library
animal文件夹下有dog.h,cat.h,dog.cpp,cat.cpp,CMakeLists.txt
- CMakeLists.txt
add_library(AnimalLib cat.cpp dog.cpp)
与animal文件夹同目录下的CMakeLists.txt
- CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(animalproject)
add_subdirectory(animal)
add_executable(app main.cpp)target_link_libraries(app PUBLIC AnimalLib)
target_include_directories(app PUBLIC "${PROJECT_SOURCE_DIR}/animal")
第四节:Object Libraries
- add_library OBJECT
- Object Library 是一个特殊的库类型,它将目标文件编译成一个库,但是不会生成最终的链接文件。这意味着你可以在后续的add_library()或add_executable()命令中,将Object Library作为源文件进行链接,从而生成最终的可执行文件或库文件
- 将target_include_directories()移入到子CMakeLists.txt中
(1)方式一
animal文件夹中的CMakeLists.txt
- CMakeLists.txt
add_library(AnimalLib OBJECT cat.cpp dog.cpp)
target_include_directories(AnimalLib PUBLIC .)
和animal文件夹同目录的CMakeLists.txt
- CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(Dog)
add_subdirectory(animal)
add_executable(app main.cpp)target_link_libraries(app PUBLIC AnimalLib)
(2)方式二,比较细粒度的分开cat和dog
animal文件夹中的CMakeLists.txt
- CMakeLists.txt
add_library(cat OBJECT cat.cpp)
target_include_directories(cat PUBLIC .)add_library(dog OBJECT dog.cpp)
target_include_directories(dog PUBLIC .)
和animal文件夹同目录的CMakeLists.txt
- CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(Dog)
add_subdirectory(animal)
add_executable(app main.cpp)target_link_libraries(app PUBLIC cat dog)
第四章 CMake与库
第一节:CMake 如何生动动态库/静态库
- 静态库
- 在连接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到
- 可执行文件中。因此对应的链接方式称为静态链接。
- 对函数库的链接是在编译时完成的!
- 动态库
- 动态库不是在编译时被链接到目标代码中,而是运行时才被载入
- 静态库对空间的浪费是巨大的!
- 命名
- 动态库的命名
- lib<name>.so/dll
- 静态库的命名
- lib<name>.a/lib
- 动态库的命名
- 命令
- file()常用于搜索源文件
- add_library(animal STATIC ${SRC})生成静态库
- add_library(animal SHARED ${SRC})生成动态库
- ${LIBRARY_OUTPUT_PATH}导出目录
通过例子来
- 使用cmake来生成静态库和动态库
创建include和src文件夹,include文件夹存放cat.h,dog.h,src文件夹存放cat.cpp,dog.cpp
- CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(Dog)file(GLOB SRC ${PROJECT_SOURCE_DIR}/src/*.cpp)
include_directories(${PROJECT_SOURCE_DIR}/include)# 静态库
# set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/staticLib)
# add_library(animal STATIC ${SRC})# 动态库
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/sharedLib)
add_library(animal SHARED ${SRC})
第二节:CMake 如何调用静态库与动态库
静态库调用流程
- 引入头文件
- 链接静态库
- 生成可执行二进制文件
- CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(Animal CXX)include_directories(${PROJECT_SOURCE_DIR}/include)
link_directories(${PROJECT_SOURCE_DIR}/staticLib)
link_libraries(animal)
add_executable(app main.cpp)
动态库调用流程
- 引入头文件
- 声明库目录
- 生成可执行二进制文件
- 链接动态库
cmake_minimum_required(VERSION 3.28.0)
project(Animal CXX)#动态
include_directories(${PROJECT_SOURCE_DIR}/include)
link_directories(${PROJECT_SOURCE_DIR}/sharedLib)
add_executable(app main.cpp)
target_link_libraries(app PUBLIC animal)
第五章 CMake与源文件的交互
animal文件夹下有dog.h,cat.h,dog.cpp,cat.cpp,CMakeLists.txt
- CMakeLists.txt
add_library(AnimalLib cat.cpp dog.cpp)
与animal文件夹同目录下的CMakeLists.txt
- CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(animalproject)# 设置C++的标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)configure_file(config.h.in config.h)add_subdirectory(animal)
add_executable(app main.cpp)target_link_libraries(app PUBLIC AnimalLib)
target_include_directories(app PUBLIC "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/animal")
- config.h.in
#define CMAKE_CXX_STANDARD 11
- main.cpp
#include <iostream>
#include "dog.h"
#include "cat.h"
#include "config.h"
using namespace std;
int main(int argc,char const* argv[]) {Dog dog;std::cout<<dog.barking()<<std::endl;Cat cat;std::cout<<cat.barking()<<std::endl;std::cout<<CMAKE_CXX_STANDARD<<std::endl;return 0;
}
第六章 CMake条件编译
animal文件夹下有dog.h,cat.h,dog.cpp,cat.cpp,cattwo.cpp,cattwo.h,CMakeLists.txt
- cattwo.h
#include <string>
namespace cattwo {std::string two();
}
- cattwo.cpp
#include "cattwo.h"
std::string cattwo::two() {return "two two mimi";
}
- cat.cpp
#include "cat.h"
#ifdef USE_CATTWO#include "cattwo.h"
#endif
std::string Cat::barking()
{
#ifdef USE_CATTWOreturn cattwo::two();
#elsereturn "cat miao miao miao";
#endif
}
- CMakeLists.txt
option(USE_CATTWO "Use cat two" ON)
# option(USE_CATTWO "Use cat two" OFF)
if(USE_CATTWO)set(SRC cat.cpp dog.cpp cattwo.cpp)
else()set(SRC cat.cpp dog.cpp)
endif()add_library(AnimalLib ${SRC})
if(USE_CATTWO)target_compile_definitions(AnimalLib PRIVATE "USE_CATTWO")
endif()
与animal文件夹同目录下的CMakeLists.txt
cmake_minimum_required(VERSION 3.28.0)
project(animalproject)
add_subdirectory(animal)
add_executable(app main.cpp)target_link_libraries(app PUBLIC AnimalLib)
target_include_directories(app PUBLIC "${PROJECT_SOURCE_DIR}/animal")
相关文章:

CMake简明教程 笔记
推荐B站视频:1.1 Cmake构建项目的流程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1xa4y1R7vT?p1&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 >>目录 1)CMake初体验 CMake构建流程Windows下使用CMake构建项目Linux下使用CMake构…...
使用 sorted set 实现令牌桶限流
业务场景为限制消息发送,要求每天不超过一次,每七天不超过三次。 Redission 的 RRateLimiter 虽然功能完备且支持自定义限流配置,但是每个限流器都需要维护三个 key,并且 lua 脚本中的判断逻辑较为复杂。 见:Redisso…...

云上高可用系统-韧性设计模式
一、走近韧性设计模式 (一)基本概念 韧性设计模式是一系列在软件工程中用于提高系统韧性的设计原则、策略、实践和模式。韧性(Resilience)在这里指的是系统对于各种故障、异常和压力的抵抗能力,以及在遭受这些挑战后…...

【保姆级教程】Windows11下go-zero的etcd安装与初步使用
【Go-Zero】Windows11下etcd的安装与初步使用 大家好 我是寸铁👊 总结了一篇Windows11下etcd的安装与初步使用的文章✨ 喜欢的小伙伴可以点点关注 💝 前言: 在使用etcd 前,我们需要了解一下etcd 是什么,为什么使用etcd…...

golang通过go-git下载gitlab源码
1 申请令牌 方法1:具体项目下申请: 方法2:全局申请 2 获取token 3 下载代码 package mainimport ("fmt""os""github.com/go-git/go-git/v5" )func main() {_, err : git.PlainClone("/tmp/foo",…...

探索Pyecharts之美-绘制多彩旭日图的艺术与技巧【第37篇—python:旭日图】
文章目录 引言准备工作绘制基本旭日图调整颜色和样式添加交互功能定制标签和标签格式嵌套层级数据高级样式与自定义进阶主题:动态旭日图数据源扩展:外部JSON文件总结 引言 数据可视化在现代编程中扮演着重要的角色,而Pyecharts是Python中一个…...

c++ QT 信号的个人理解 信号就是独立文件调用的一种“协议”
一. 简介 就我个人来理解,信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。 信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起&a…...
C#语法(关键字)
C#关键字 关键字是C#编译器预定义的保留字。这些关键字不能作为标识符,但是,如果您想要用它们做标识符,在这个前面加个字符做前缀。 保留关键字abstractasbaseboolbreakbytecasecatchcharcheckedclassconstcontinuedecimaldefaultdelegated…...

让B端管理软件既美观又实用的解决方案来了
hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 让B端管理软件既美观又实用的解决方案来了 在当今数字化时代,B端管理软件已…...

npm run dev,vite 配置 ip 访问
启动项目通过本地 ip 的方式访问 方式一.通过修改 package.json "scripts": {"dev": "vite --host 0.0.0.0",}, 方式二.通过修改 vite.config.ts export default defineConfig({plugins: [vue(), vueJsx()],server: { // 配置 host 与 port 方…...

实验3:数据显示输出
1、实验目的: 掌握将内存单元存储的数据显示输出到显示器的方法。 2、实验内容: 将内存单元存储的字节数据(例如 56H)的16进制数的低位输出到显示器并显示。 3、实验要求: (1)运行程序后&a…...
查看 Avro 格式的 Kafka 消息(启用了 Confluent Schema Registry )
使用 Avro 格式传递 Kafka 消息要比 Json 更加高效,因为它是二进制格式,在启用了 Confluent Schema Registry 的情况下,会进一步地提升传输效率,因为 Avro 中的 Schema 信息将不再出现在消息中,消息体积会进一步压缩,同时,还可以利用到 Schema Registry 的其他好处,例如…...

QT+VS实现Kmeans聚类算法
1、Kmeans的定义 聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习。k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使…...

openssl3.2 - 测试程序的学习 - test\acvp_test.c
文章目录 openssl3.2 - 测试程序的学习 - test\acvp_test.c概述笔记要单步学习的测试函数备注END openssl3.2 - 测试程序的学习 - test\acvp_test.c 概述 openssl3.2 - 测试程序的学习 将test*.c 收集起来后, 就不准备看makefile和make test的日志参考了. 按照收集的.c, 按照…...
Qt Quick 项目(第二集Qt Quick Application创建)
上集回顾 Qt Quick 项目(第一集Qt Quick UI 项目项目创建) 如果将程序的用户界面称为前端,将程序中的数据存储和业务逻辑称为后端,那么传统Qt应用程序的前端和后端都是使用C++来完成的。对于现代软件开发而言,这里有一个存在已久的冲突:前端的演化速度要远快于后端。当用…...

深度强化学习(王树森)笔记03
深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…...

Cesium材质特效
文章目录 0.引言1.视频材质2.分辨率尺度3.云4.雾5.动态水面6.雷达扫描7.流动线8.电子围栏9.粒子烟花10.粒子火焰11.粒子天气 0.引言 现有的gis开发方向较流行的是webgis开发,其中Cesium是一款开源的WebGIS库,主要用于实时地球和空间数据的可视化和分析。…...

华为产业链之车载激光雷达
一、智能汽车 NOA 加快普及,L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 (ADAS, Advanced driver-assistance system)分“感知层、决策层、执行层”三个层级,其中感知层是最重要的一环…...
java的Object类的hasCode()和ToString()
(1)hasCode解释 hashCode()是Object类中定义的方法,用于返回对象的哈希码值。哈希码值是一个整数,用于在哈希表等数据结构中快速定位对象。 在Java中,哈希码值的计算是基于对象的内存地址的。默认情况下,ha…...
php数组算法(1)判断一维数组和多元数组中的元素是否相等并输出键值key
在php中,如何判断[1,0,1]和[ [0, 0, 0],//体质正常 [1, 0, 0],//气虚体质 [0, 1, 0],//血瘀体质 [0, 0, 1],//阴虚体质 [1, 1, 0],//气虚兼血瘀体质 [1, 0, 1],//气虚兼阴虚体质 [0, 1, 1],//血瘀兼阴虚体质 [1, 1, 1],//气虚兼血瘀兼阴虚体质 ];中的第n项相等&…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...