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

CMake简明教程 笔记

推荐B站视频:1.1 Cmake构建项目的流程_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1xa4y1R7vT?p=1&vd_source=a934d7fc6f47698a29dac90a922ba5a3

>>目录

1)CMake初体验

  1. CMake构建流程
  2. Windows下使用CMake构建项目
  3. Linux下使用CMake构建项目

2)CMake语法

  1. 概述以及如何打印
  2. 变量操作set、list
  3. 流程控制
  4. 函数
  5. 作用域

3)CMake构建项目的四种方式

  1.   直接写入源码路径的方式
  2.   调用cmake脚本的方式
  3.   CMakeLists嵌套
  4.   Object Libraries

4)CMake与静态库和动态库

  1. 如何生成静态库和动态库
  2. 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流程

  1. 预处理(-E参数 宏替换等)
  2. 编译 gcc/msvc/clang(-S参数)
  3. 汇编(-C参数 linux生成.o文件、windows生成.obj文件)
  4. 连接(将多个二进制文件连接生成一个可执行的文件)

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 有两种作用域

  1. Function scope 函数作用域
  2. 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 如何生动动态库/静态库

  • 静态库
  1. 在连接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到
  2. 可执行文件中。因此对应的链接方式称为静态链接。
  3. 对函数库的链接是在编译时完成的!
  • 动态库
  1.  动态库不是在编译时被链接到目标代码中,而是运行时才被载入
  2.  静态库对空间的浪费是巨大的!
  • 命名
    • 动态库的命名
      • 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 如何调用静态库与动态库

静态库调用流程

  1. 引入头文件
  2. 链接静态库
  3. 生成可执行二进制文件
  • 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)

动态库调用流程

  1. 引入头文件
  2. 声明库目录
  3. 生成可执行二进制文件
  4. 链接动态库
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站视频&#xff1a;1.1 Cmake构建项目的流程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1xa4y1R7vT?p1&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 >>目录 1&#xff09;CMake初体验 CMake构建流程Windows下使用CMake构建项目Linux下使用CMake构…...

使用 sorted set 实现令牌桶限流

业务场景为限制消息发送&#xff0c;要求每天不超过一次&#xff0c;每七天不超过三次。 Redission 的 RRateLimiter 虽然功能完备且支持自定义限流配置&#xff0c;但是每个限流器都需要维护三个 key&#xff0c;并且 lua 脚本中的判断逻辑较为复杂。 见&#xff1a;Redisso…...

云上高可用系统-韧性设计模式

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

【保姆级教程】Windows11下go-zero的etcd安装与初步使用

【Go-Zero】Windows11下etcd的安装与初步使用 大家好 我是寸铁&#x1f44a; 总结了一篇Windows11下etcd的安装与初步使用的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言&#xff1a; 在使用etcd 前&#xff0c;我们需要了解一下etcd 是什么&#xff0c;为什么使用etcd…...

golang通过go-git下载gitlab源码

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

探索Pyecharts之美-绘制多彩旭日图的艺术与技巧【第37篇—python:旭日图】

文章目录 引言准备工作绘制基本旭日图调整颜色和样式添加交互功能定制标签和标签格式嵌套层级数据高级样式与自定义进阶主题&#xff1a;动态旭日图数据源扩展&#xff1a;外部JSON文件总结 引言 数据可视化在现代编程中扮演着重要的角色&#xff0c;而Pyecharts是Python中一个…...

c++ QT 信号的个人理解 信号就是独立文件调用的一种“协议”

一. 简介 就我个人来理解&#xff0c;信号槽机制与Windows下消息机制类似&#xff0c;消息机制是基于回调函数&#xff0c;Qt中用信号与槽来代替函数指针&#xff0c;使程序更安全简洁。 信号和槽机制是 Qt 的核心机制&#xff0c;可以让编程人员将互不相关的对象绑定在一起&a…...

C#语法(关键字)

C#关键字 关键字是C#编译器预定义的保留字。这些关键字不能作为标识符&#xff0c;但是&#xff0c;如果您想要用它们做标识符&#xff0c;在这个前面加个字符做前缀。 保留关键字abstractasbaseboolbreakbytecasecatchcharcheckedclassconstcontinuedecimaldefaultdelegated…...

让B端管理软件既美观又实用的解决方案来了

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; 让B端管理软件既美观又实用的解决方案来了 在当今数字化时代&#xff0c;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、实验目的&#xff1a; 掌握将内存单元存储的数据显示输出到显示器的方法。 2、实验内容&#xff1a; 将内存单元存储的字节数据&#xff08;例如 56H&#xff09;的16进制数的低位输出到显示器并显示。 3、实验要求&#xff1a; &#xff08;1&#xff09;运行程序后&a…...

查看 Avro 格式的 Kafka 消息(启用了 Confluent Schema Registry )

使用 Avro 格式传递 Kafka 消息要比 Json 更加高效,因为它是二进制格式,在启用了 Confluent Schema Registry 的情况下,会进一步地提升传输效率,因为 Avro 中的 Schema 信息将不再出现在消息中,消息体积会进一步压缩,同时,还可以利用到 Schema Registry 的其他好处,例如…...

QT+VS实现Kmeans聚类算法

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

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

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…...

Cesium材质特效

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

华为产业链之车载激光雷达

一、智能汽车 NOA 加快普及&#xff0c;L3 上路利好智能感知硬件 1、感知层是 ADAS 最重要的一环 先进驾驶辅助系统 &#xff08;ADAS&#xff0c; Advanced driver-assistance system&#xff09;分“感知层、决策层、执行层”三个层级&#xff0c;其中感知层是最重要的一环…...

java的Object类的hasCode()和ToString()

&#xff08;1&#xff09;hasCode解释 hashCode()是Object类中定义的方法&#xff0c;用于返回对象的哈希码值。哈希码值是一个整数&#xff0c;用于在哈希表等数据结构中快速定位对象。 在Java中&#xff0c;哈希码值的计算是基于对象的内存地址的。默认情况下&#xff0c;ha…...

php数组算法(1)判断一维数组和多元数组中的元素是否相等并输出键值key

在php中&#xff0c;如何判断[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项相等&…...

已解决Error:AttributeError: module ‘numpy‘ has no attribute ‘float‘.

成功解决Error&#xff1a;AttributeError: module ‘numpy‘ has no attribute ‘float‘. &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;报错分析&#x1f333;&#x1f333;解决方案1&#xff1a;降低NumPy版本&#x1f333;&#x1f33…...

WordPress块编辑器(Gutenberg古腾堡)中如何添加脚注?

WordPress默认自带的块编辑器​&#xff08;Gutenberg古腾堡编辑器&#xff09;本身就自带添加脚注功能&#xff0c;不过经典编辑器不行。如果想要在WordPress中添加更加专业的脚注&#xff0c;建议使用Modern Footnotes插件&#xff0c;具体介绍及使用请参考『WordPress站点如…...

burpsuite怎么进行本地抓包?ctfer测试自搭建靶场必须学会!

自己搭建靶场测试题目是ctfer不可避免的环节&#xff0c;怎么用burp对本地回环即localhost进行抓包&#xff1f;笔者在本篇分享一下自己的解决经验。 笔者用的是Chrome浏览器&#xff0c;如果是火狐浏览器可以参考本篇&#xff1a;Burp Suite抓不到本地包/localhost包问题解决…...

VSCode Python调试运行:json编写

对于需要在命令行传参运行的项目&#xff0c;如果想要调试运行&#xff0c;则需要编写对应的launch.json文件这里记录一下json文件的编写格式&#xff1a; {"version": "0.2.0","configurations": [{"python": "/data/xxx/minic…...

自动化Web页面性能测试介绍

随着越来越多的用户使用移动设备访问 Web 应用&#xff0c;使得 Web 应用需要支持一些性能并不是很好的移动设备。为了度量和测试 Web 应用是不是在高复杂度的情况下&#xff0c;页面性能能满足用户的需求。 同时&#xff0c;随着 Web 应用的空前发展&#xff0c;前端业务逐渐…...

可视化 | 【d3】力导向关系图优化(搜索+刷新)

文章目录 &#x1f4da;优化内容&#x1f4da;html和css优化&#x1f407;搜索框部分&#x1f407;刷新按钮部分 &#x1f4da;js&#x1f407;搜索框部分&#x1f407;刷新部分 前期回顾&#xff1a;【d3】力导图优化&#xff0c;本文主要是基于上篇代码&#xff0c;以代码段添…...

2024.1.26力扣每日一题——计算 K 置位下标对应元素的和

2024.1.26 题目来源我的题解方法一 位运算统计二进制数中1的个数方法二 官方的一种优化计算二进制中1的个数的方法 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2859 我的题解 方法一 位运算统计二进制数中1的个数 对于每一个位置i都去计算i对应的二进制数中1的个数 …...

R语言【taxlist】——levels():获取或设置分类等级列表

Package taxlist version 0.2.4 Description 分类层次结构可以设置为 taxlist 对象中的级别&#xff0c;按从低到高的顺序排列。 在 taxlist 对象中为特定分类概念添加分类级别。此外&#xff0c;概念限制的变化可能涉及其分类层次结构的变化。 Usage levels(x)## S3 method…...

单元测试——题目十三

目录 题目要求: 定义类 测试类 题目要求: 根据输入的三条边值判断能组成何种三角形。三条边为变量a、b、c,范围为1≤边值≤10,不在范围内,提示“输入边值不在范围内”。不满足任意两边之和必须大于第三边,提示“输入边值不能组成三角形”。输入边值能组成三角形,只有…...

使用Linux SDK客户端向AWS Iot发送数据

参考链接&#xff1a; https://ap-southeast-1.console.aws.amazon.com/iot/home?regionap-southeast-1#/test 此篇文章用于测试&#xff0c;使用Linux SDK客户端向AWS Iot发送数据&#xff0c;准备环境如下&#xff1a; 1、客户端环境准备 1.1 客户端操作系统 虚拟机一台…...