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

CMAKE常用命令详解

NDK

List基本用法

Get–获取列表中指定索引的元素

list(Get list_name index output_var)
解释
  • list_name: 要操作集合的名称
  • index: 要取得的元素下标
  • output_var: 保存从集合中取得元素的结果
栗子
list(GET mylist 0 first_element)  # 获取第一个元素

APPEND–在列表末尾添加元素

list(APPEND list_name element1 element2 ...)
解释
  • list_name: 集合名称
  • element1: 添加集合元素的名称
栗子
list(APPEND mylist "new_item")

INSERT–在指定位置插入元素

list(INSERT list_name index element1 element2 ...)
解释
  • list_name: 集合名称
  • index: 要插入的索引位置
  • element1: 添加集合元素的名称
栗子
list(INSERT mylist 0 "first_item") # 在开头插入

REMOVE_ITEM–移除指定元素

list(REMOVE_ITEM list_name value1 value2 ...)
解释
  • list_name: 集合名称
  • value1: 要移除元素的名称
栗子
list(REMOVE_ITEM mylist "item_to_remove")

LENGTH–获取列表长度

list(LENGTH list_name output_var)
解释
  • list_name: 集合名称
  • output_var: 集合长度
栗子
list(LENGTH mylist list_size)

SORT–列表排序

list(SORT list_name)
解释
  • list_name: 集合名称
栗子
list(SORT mylist) # 按字母顺序排序

string基本用法

REPLACE–替换

string(REPLACE <match_string> <replace_string> <output_variable> <input>)
解释
  • match_string: 要匹配的字符串
  • replace_string: 要替换的字符串
  • output_variable: 存储结果的变量
  • input: 输入的字符串
栗子
string(REPLACE "." ";" VERSION_LIST "1.2.3")  # 结果: "1;2;3"

SUBSTRING–截取

string(SUBSTRING <input> <begin> <length> <output_variable>)
解释
  • input: 输入的字符串

  • begin: 开始截取的起始位置

  • length: 要截取的长度

  • output_variable: 存储结果的变量

栗子
string(SUBSTRING "Hello World" 0 5 RESULT)  # 结果: "Hello"

LENGTH–长度

string(LENGTH <input> <output_variable>)
解释
  • input: 输入的字符串
  • output_variable: 存储结果的变量
栗子
string(LENGTH "Hello" LEN)  # 结果: 5

TOUPPER–转大写

string(TOUPPER <input> <output_variable>)
解释
  • input: 输入的字符串
  • output_variable: 存储结果的变量
栗子
string(TOUPPER "hello" RESULT)  # 结果: "HELLO"

TOLOWER–转小写

string(TOUPPER <input> <output_variable>)
解释
  • input: 输入的字符串
  • output_variable: 存储结果的变量
栗子
string(TOLOWER "HELLO" RESULT)  # 结果: "hello"

FIND–查找

string(FIND <input> <substring> <output_variable>)
解释
  • input: 输入的字符串
  • substring: 查找的字符串
  • output_variable: 存储结果的变量
栗子
string(FIND "Hello World" "World" POSITION)  # 结果: 6

COMPARE–比较

string(COMPARE EQUAL <input1> <input2> <output_variable>)
解释
  • input1: 输入的字符串1
  • input2: 输入的字符串2
  • output_variable: 存储结果的变量
栗子
string(COMPARE EQUAL "hello" "hello" RESULT)  # 结果: TRUE

function–函数基本用法

# 定义函数
function(函数名 [参数1] [参数2] ...)# 函数体
endfunction()# 调用函数
函数名(参数1 参数2 ...)
参数访问

通过参数名字节访问

# 通过参数名直接访问
message("First argument: ${arg1}")
message("Second argument: ${arg2}")

通过ARGV访问所有参数

(argc,argv[])是不是很眼熟,和C语言的访问方式一样

# 通过ARGV访问所有参数
message("All args: ${ARGV}")             # 所有参数的列表
message("Arg count: ${ARGC}")            # 参数个数
message("Arg 0: ${ARGV0}")               # 第一个参数
message("Arg 1: ${ARGV1}")               # 第二个参数
返回值处理
function(my_function result_var)# 使用PARENT_SCOPE设置父作用域变量set(${result_var} "some value" PARENT_SCOPE)
endfunction()# 调用并获取结果
my_function(RESULT)
message("Result: ${RESULT}")

macro–函数的另一版

由于marco和``function的用法非常相似,所以这里与function做一个对比,突出macro`的功能

变量作用域

# Macro示例 - 变量会影响外部作用域
macro(test_macro)set(var "macro value")    # 会改变外部var的值
endmacro()# Function示例 - 变量仅在函数内有效
function(test_function)set(var "function value") # 不会改变外部var的值
endfunction()# 使用示例
set(var "original value")
test_macro()
message("After macro: ${var}")    # 输出: "macro value"set(var "original value")
test_function()
message("After function: ${var}") # 输出: "original value"

参数处理

# Macro中的参数是文本替换
macro(test_macro arg)message("arg = ${arg}")       # 直接使用参数名set(${arg} "new value")       # 可以修改外部变量
endmacro()# Function中的参数是值传递
function(test_function arg)message("arg = ${arg}")       # 使用参数值set(${arg} "new value")       # 需要PARENT_SCOPE才能修改外部变量
endfunction()

返回值处理

# Macro没有真正的返回值机制
macro(test_macro result)set(${result} "macro result")  # 直接修改外部变量
endmacro()# Function需要使用PARENT_SCOPE来返回值
function(test_function result)set(${result} "function result" PARENT_SCOPE)  # 使用PARENT_SCOPE修改父作用域
endfunction()

变量引用

# Macro中的变量引用
macro(test_macro var)message("${${var}}")  # 需要两层${}来获取变量值
endmacro()# Function中的变量引用
function(test_function var)message("${var}")     # 直接使用参数值
endfunction()

特殊变量的行为

# Macro中的ARGN
macro(test_macro arg)message("ARGN = ${ARGN}")  # ARGN包含所有额外参数
endmacro()# Function中的ARGN
function(test_function arg)message("ARGN = ${ARGN}")  # ARGN是一个新的局部变量
endfunction()

递归调用

# Macro的递归可能导致无限展开
macro(recursive_macro count)if(count GREATER 0)math(EXPR new_count "${count} - 1")recursive_macro(${new_count})  # 可能导致问题endif()
endmacro()# Function的递归更安全
function(recursive_function count)if(count GREATER 0)math(EXPR new_count "${count} - 1")recursive_function(${new_count})  # 正常工作endif()
endfunction()

if基本用法

由于if比较简单,所以直接在这里写栗子了

基本比较
# 基础语法
if(条件)# 条件为真时执行
elseif(条件2)# 条件2为真时执行
else()# 所有条件为假时执行
endif()# 常量比较
if(TRUE)  # 也可以用1, ON, YES, Ymessage("True")
endif()if(FALSE) # 也可以用0, OFF, NO, N, IGNORE, NOTFOUND, ""message("False")
endif()
数值比较
# 数值比较运算符
if(1 EQUAL 1)        # 等于
if(1 LESS 2)         # 小于
if(2 GREATER 1)      # 大于
if(1 LESS_EQUAL 1)   # 小于等于
if(1 GREATER_EQUAL 1)# 大于等于# 版本号比较
if(1.2.3 VERSION_LESS 1.2.4)
if(1.2.3 VERSION_GREATER 1.2.2)
if(1.2.3 VERSION_EQUAL 1.2.3)
if(1.2.3 VERSION_LESS_EQUAL 1.2.3)
if(1.2.3 VERSION_GREATER_EQUAL 1.2.3)
字符串比较
# 字符串比较
if("string" STREQUAL "string")  # 字符串相等
if("string" MATCHES "str.*")    # 正则匹配# 字符串比较(不区分大小写)
if("String" STREQUAL "string")          # 为假
if("String" STREQUAL "string" CASE INSENSITIVE) # 为真
路径比较
# 路径比较
if(path1 PATH_EQUAL path2)  # 判断两个路径是否相同# 检查路径是否存在
if(EXISTS "/path/to/file")
if(IS_DIRECTORY "/path/to/dir")
if(IS_SYMLINK "/path/to/symlink")
变量检查
# 变量定义检查
if(DEFINED VARIABLE)         # 检查变量是否被定义
if(NOT DEFINED VARIABLE)     # 检查变量是否未定义# 变量值检查
if(VARIABLE)                # 检查变量值是否为真
if(NOT VARIABLE)            # 检查变量值是否为假# 环境变量检查
if(DEFINED ENV{PATH})       # 检查环境变量是否定义
if($ENV{PATH})             # 检查环境变量的值
逻辑运算
# 与运算
if(condition1 AND condition2)
if(condition1 AND condition2 AND condition3)# 或运算
if(condition1 OR condition2)
if(condition1 OR condition2 OR condition3)# 非运算
if(NOT condition)# 复杂逻辑组合
if((A OR B) AND (C OR D))
文件操作相关
# 文件检查
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/file.txt")
if(IS_NEWER_THAN file1 file2)
if(IS_ABSOLUTE path)# 权限检查
if(IS_DIRECTORY dir AND EXISTS "${dir}/file")
策略和特性检查
# 检查CMake策略
if(POLICY CMP0048)cmake_policy(SET CMP0048 NEW)
endif()# 检查编译器特性
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if(MSVC)
if(APPLE)
if(UNIX)
if(WIN32)
目标库检查
# 检查目标是否存在
if(TARGET target_name)# 检查库是否找到
find_package(OpenGL)
if(OpenGL_FOUND)# 使用OpenGL
endif()

get_property–获取属性值

基本语法

get_property(<variable><GLOBAL | DIRECTORY | TARGET | SOURCE | INSTALL | TEST | CACHE | VARIABLE>PROPERTY <property_name>[DEFINED | SET | BRIEF_DOCS | FULL_DOCS])

解释

  • variable: 用于存储获取到的属性值的变量名
  • 作用域参数(必选其一):
    • GLOBAL - 全局属性
    • DIRECTORY - 目录属性
    • TARGET - 目标属性
    • **SOURCE **- 源文件属性
    • INSTALL - 安装属性
    • **TEST **- 测试属性
    • **CACHE **- 缓存属性
    • VARIABLE - 变量属性
  • PROPERTY <property_name> - 要获取的属性名称

math–数学计算

基本用法

math(EXPR <output_variable> "<expression>")

解释

  • EXPR: 固定格式
  • output_variable: 保存计算后的结果的变量
  • “”: 计算的表达式

栗子

# 多个运算符组合
math(EXPR result "(10 + 5) * 2")  # result = 30# 使用变量
set(a 10)
set(b 20)
math(EXPR result "${a} + ${b}")  # result = 30

message–输出消息日志

基本用法

message([<mode>] "message text")

解释

  • mode: 类型
  • “message text”: 输出的消息

栗子

# 状态信息(默认)
message(STATUS "This is a status message")# 错误信息(会终止CMake运行)
message(FATAL_ERROR "This is a fatal error message")# 警告信息(不会终止)
message(WARNING "This is a warning message")# 作者警告
message(AUTHOR_WARNING "This is an author warning message")# 调试信息
message(DEBUG "This is a debug message")# 普通信息(无前缀)
message("This is a normal message")# 发送到stderr的信息
message(SEND_ERROR "This is an error message")# 弃用警告
message(DEPRECATION "This feature is deprecated")

option–布尔类型变量

option命令用于定义布尔类型的选项变量

基本语法

option(<variable> "<help_text>" [value])

参数解释

  • variable: 变量名称
  • “<help_text>”: 帮助文本
  • value: 变量的初始值

栗子

# 构建选项
option(ENABLE_SHARED "Build shared libraries" TRUE)
option(ENABLE_STATIC "Build static libraries" TRUE)

file–文件操作

模板的用法

读取文件

# 读取整个文件到变量
file(READ "filename.txt" file_contents)# 读取文件的前N个字节
file(READ "filename.txt" file_contents LIMIT 1024)# 按行读取文件到列表
file(STRINGS "filename.txt" file_lines)# 读取并去除注释和空行
file(STRINGS "filename.txt" file_lines REGEX "^[^#]")

写入文件

# 写入内容到文件(覆盖)
file(WRITE "output.txt" "Some content")# 追加内容到文件
file(APPEND "output.txt" "More content")# 生成文件
file(GENERATE OUTPUT "config.h" CONTENT "
#define VERSION \"${VERSION}\"
#define BUILD_TYPE \"${CMAKE_BUILD_TYPE}\"
")

文件操作

# 复制文件
file(COPY "source.txt" DESTINATION "dest/")# 复制并重命名
file(COPY_FILE "source.txt" "dest/new.txt")# 删除文件
file(REMOVE "filename.txt")# 删除多个文件
file(REMOVE_RECURSE "dir1" "dir2")# 创建目录
file(MAKE_DIRECTORY "new_dir")

文件查找

# 查找文件
file(GLOB source_files "src/*.cpp")# 递归查找文件
file(GLOB_RECURSE all_sources "src/*.cpp""src/*.h"
)# 相对路径查找
file(GLOB_RECURSE relative_pathsRELATIVE "${CMAKE_CURRENT_SOURCE_DIR}""*.cpp"
)

路径操作

# 获取真实路径
file(REAL_PATH "relative/path" absolute_path)# 获取相对路径
file(RELATIVE_PATH rel_path "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}"
)# 规范化路径
file(TO_CMAKE_PATH "path/with\\mixed/separators" cmake_path)
file(TO_NATIVE_PATH "${cmake_path}" native_path)

文件下载

# 下载文件
file(DOWNLOAD "https://example.com/file.zip""${CMAKE_BINARY_DIR}/file.zip"SHOW_PROGRESS
)# 下载并验证
file(DOWNLOAD "https://example.com/file.zip""${CMAKE_BINARY_DIR}/file.zip"EXPECTED_HASH SHA256=abcdef...TLS_VERIFY ON
)

文件权限

# 设置权限
file(CHMOD "script.sh" PERMISSIONSOWNER_READ OWNER_WRITE OWNER_EXECUTEGROUP_READ GROUP_EXECUTEWORLD_READ WORLD_EXECUTE
)# 获取权限
file(GET_RUNTIME_DEPENDENCIESEXECUTABLES my_exeLIBRARIES my_libDIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
)

Configure_file–从模板生成输出文件

基本用法

configure_file(<model_file> <output_file>)

解释

  • model_file: 模板文件
  • output_file: 输出文件

栗子

  1. 变量替换

    # config.h.in 文件内容:
    #define VERSION_MAJOR @VERSION_MAJOR@     // 使用 @变量名@ 语法
    #define VERSION_MINOR @VERSION_MINOR@     // 使用 @变量名@ 语法
    #define PROJECT_NAME "${PROJECT_NAME}"    // 使用 ${变量名} 语法# CMakeLists.txt
    set(VERSION_MAJOR 1)
    set(VERSION_MINOR 0)
    configure_file("config.h.in""${PROJECT_BINARY_DIR}/config.h"
    )# 生成的 config.h 文件内容会是:
    #define VERSION_MAJOR 1
    #define VERSION_MINOR 0
    #define PROJECT_NAME "YourProjectName"
    
  2. 条件替换

    # config.h.in
    #cmakedefine USE_FEATURE      // 条件定义宏
    #cmakedefine01 HAVE_LIBRARY   // 条件定义为0或1# CMakeLists.txt
    option(USE_FEATURE "Enable feature" ON)    # 设置为ON
    set(HAVE_LIBRARY TRUE)                     # 设置为TRUE
    configure_file("config.h.in""${PROJECT_BINARY_DIR}/config.h"
    )# 生成的 config.h 文件内容会是:
    #define USE_FEATURE           // 因为 USE_FEATURE 是 ON
    #define HAVE_LIBRARY 1        // 因为 HAVE_LIBRARY 是 TRUE
    

    add_subdirectory–构建添加子目录

    基本用法

    add_subdirectory(source_dir)
    

    解释

    • source_dir: 子目录中CMakeLists.txt路径

    栗子

    项目结构

    project/
    ├── CMakeLists.txt
    ├── src/
    │ ├── CMakeLists.txt
    │ └── main.cpp
    ├── lib/
    │ ├── CMakeLists.txt
    │ └── library.cpp
    └── tests/
    ├── CMakeLists.txt
    └── test.cpp

CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 添加各个子目录
add_subdirectory(src)
add_subdirectory(lib)
add_subdirectory(tests)

add_library–创建一个库

基本用法

与下面set_target_properties搭配使用

add_library(<name> [STATIC | SHARED] [SOURCE1 | SOURCE2])

解释

  • name: 库的名称
  • [STATIC | SHARED]: 库的类型
  • [SOURCE1 | SOURCE2]: 源文件的地址

栗子

创建普通库

# 1. 创建静态库 (.a / .lib)
add_library(mylib STATIC source1.cpp source2.cpp)# 2. 创建动态库 (.so / .dll)
add_library(mylib SHARED source1.cpp source2.cpp)

导入外部库

# 导入预编译的共享库
add_library(thirdparty SHARED IMPORTED)
set_target_properties(thirdparty PROPERTIESIMPORTED_LOCATION "/path/to/libthirdparty.so"
)

set_target_properties–设置目标文件的属性

基本用法

常用语设置库的相关属性,栗子,参考上方

set_target_properties(target1 target2 ...PROPERTIESprop1 value1prop2 value2 ...)

target_include_directories–添加头文件搜索路径

基本用法

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

解释

  • target: 目标文件
  • <INTERFACE|PUBLIC|PRIVATE>: 权限
  • item: 头文件搜索路径

栗子

PRIVATE

# 只有当前目标能使用这些包含目录
target_include_directories(mylib PRIVATE${CMAKE_CURRENT_SOURCE_DIR}/internal
)

PUBLIC

# 当前目标和链接此目标的其他目标都能使用这些包含目录
target_include_directories(mylib PUBLIC${CMAKE_CURRENT_SOURCE_DIR}/include
)

INTERFACE

# 只有链接此目标的其他目标能使用这些包含目录
target_include_directories(mylib INTERFACE${CMAKE_CURRENT_SOURCE_DIR}/public_api
)

target_link_libraries–链接库

基本用法

target_link_libraries(<target><PRIVATE|PUBLIC|INTERFACE> <item>...[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)

解释

  • target: 链接后的名称
  • <PRIVATE|PUBLIC|INTERFACE>: 权限
  • item: 要链接的包名

相关文章:

CMAKE常用命令详解

NDK List基本用法 Get–获取列表中指定索引的元素 list(Get list_name index output_var)解释 list_name: 要操作集合的名称index: 要取得的元素下标output_var: 保存从集合中取得元素的结果 栗子 list(GET mylist 0 first_element) # 获取第一个元素APPEND–在列表末尾…...

Vue3的通灵之术Teleport

前言 近期Vue3更新了一些新的内容&#xff0c;我都还没有一个一个仔细去看&#xff0c;但是还是有必要去解读一下新内容的。就先从Teleport 开始吧。 官方对 Teleport 的解释是&#xff1a;<Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传…...

ue5第三人称闯关游戏学习(一)

视频资料38 - Compilers and Editors_哔哩哔哩_bilibili 上一个第一人称射击项目做完 接下来要更深入学习。 引入资产与C来创建第三人称闯关游戏 这次要引入的资产有两个分别是 Unreal Learning Kit&#xff1a;Game和stylized character kit: casual 01 不过有个比较麻…...

IIC 随机写+多次写 可以控制写几次

verilog module icc_tx#(parameter SIZE 2 , //用来控制写多少次 比如地址是0000 一个地址只能存放8bit数据 超出指针就会到下一个地址0001parameter CLK_DIV 50_000_000 ,parameter SPEED 100_000 ,parameter LED 50 )( input wire c…...

controller中的参数注解@Param @RequestParam和@RequestBody的不同

现在controller中有个方法&#xff1a;&#xff08;LoginUserRequest是一个用户类对象&#xff09; PostMapping("/test/phone")public Result validPhone(LoginUserRequest loginUserRequest) {return Result.success(loginUserRequest);}现在讨论Param("login…...

手搓人工智能-最优化算法(1)最速梯度下降法,及推导过程

“Men pass away, but their deeds abide.” 人终有一死&#xff0c;但是他们的业绩将永存。 ——奥古斯坦-路易柯西 目录 前言 简单函数求极值 复杂函数梯度法求极值 泰勒展开 梯度&#xff0c;Nabla算子 Cauchy-Schwarz不等式 梯度下降算法 算法流程 梯度下降法…...

多目标优化算法——多目标粒子群优化算法(MOPSO)

Handling Multiple Objectives With Particle Swarm Optimization&#xff08;多目标粒子群优化算法&#xff09; 一、摘要&#xff1a; 本文提出了一种将帕累托优势引入粒子群优化算法的方法&#xff0c;使该算法能够处理具有多个目标函数的问题。与目前其他将粒子群算法扩展…...

Swift——自动引用计数ARC

ARC ARC是swift使用的一种管理应用程序内存的机制&#xff0c;对于C语言我们知道&#xff0c;当我们申请一块空间&#xff0c;通常需要手动释放&#xff0c;不然会造成空间浪费&#xff0c;而有了ARC机制&#xff0c;你无需考虑内存的管理&#xff0c;因为ARC会在类的实例不再…...

【Quarkus】基于CDI和拦截器实现AOP功能(进阶版)

Quarkus 基于CDI和拦截器实现AOP功能&#xff08;进阶版&#xff09; 拦截器的属性成员拦截器的重复使用基于属性成员和重复使用的拦截器的发消息案例 本节来了解一下拦截器高级特性&#xff08;拦截器的重复使用和属性成员&#xff09;&#xff0c;官网说明&#xff1a;https:…...

【踩坑日记】【教程】如何在ubuntu服务器上配置公钥登录以及bug解决

前言 在日常开发和运维中&#xff0c;为了提高服务器登录的安全性&#xff0c;我们通常会选择使用 SSH 密钥认证 来替代传统的密码登录。然而&#xff0c;在配置 SSH 公钥登录的过程中&#xff0c;可能会遇到各种坑和 Bug。本文将从零开始&#xff0c;手把手教你如何在 Ubuntu…...

insmod一个ko提供基础函数供后insmod的ko使用的方法

一、背景 在内核模块开发时&#xff0c;多个不同的内核模块&#xff0c;有时候可能需要都共用一些公共的函数&#xff0c;比如申请一些平台性的公共资源。但是&#xff0c;这些公共的函数又不方便去加入到内核镜像里&#xff0c;这时候就需要把这些各个内核模块需要用到的一些…...

七、传统循环神经网络(RNN)

传统循环神经网络 RNN 前言一、RNN 是什么&#xff1f;1.1 RNN 的结构1.2 结构举例 二、RNN 模型的分类2.1 按照 输入跟输出 的结构分类2.2 按照 内部结构 分类 三、传统 RNN 模型3.1 RNN内部结构图3.2 内部计算公式3.3 其中 tanh 激活函数的作用3.4 传统RNN优缺点 四、代码演示…...

LeetCode:19.删除链表倒数第N个节点

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;19.删除链表倒数第N个节点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表…...

【RISC-V CPU debug 专栏 2 -- Debug Module (DM), non-ISA】

文章目录 调试模块(DM)功能必须支持的功能可选支持的功能兼容性要求规模限制Debug Module Interface (DMI)总线类型地址与操作地址空间控制机制Debug Module Interface Signals请求信号响应信号信号流程Reset Control复位控制方法全局复位 (`ndmreset`)Hart 复位 (`hartreset…...

单片机学习笔记 11. 外部中断

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...

基于stm32的智能教室管理系统/智能家居系统

基于stm32的智能教室管理系统/智能家居系统 持续更新&#xff0c;欢迎关注!!! ** 基于stm32的智能教室管理系统/智能家居系统 ** 目前&#xff0c;物联网已广泛应用在我们的生活中。智慧校园是将校园中的生活、学习、工作等相关的资源联系在一起&#xff0c;实现管理的智能化…...

基于 Qt 和 GStreamer 的环境中构建播放器

一、功能与需求分析 功能描述 播放本地视频文件(如 MP4、MKV)。 支持基本控制功能(播放、暂停、停止、跳转)。 提供音量调节功能。 在 Windows 环境下使用 Visual Studio 2022 编译。 技术选型 Qt:用于构建用户界面。 GStreamer:负责视频解码和播放。 Visual Studio 202…...

windows docker 入门

这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步&#xff1a;安装Docker Desktop for Windows 系统要求&#xff1a; Windows 10 64位版本&#xff08;专业版、企业版或教育版&#xff09;。启用Hyper-V和Windows Subsystem for Linux (WSL 2)。…...

baomidou Mabatis plus引入异常

1 主要异常信息 Error creating bean with name dataSource 但是有个重要提示 dynamic-datasource Please check the setting of primary 解决方法&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring…...

深度学习中的正则化模型是什么意思?

一、定义 在深度学习中&#xff0c;正则化是一种用于防止过拟合的技术。过拟合是指模型在训练数据上表现非常好&#xff0c;但在新的、未见过的数据&#xff08;测试数据&#xff09;上表现很差的情况。正则化模型就是通过在损失函数中添加额外的项来约束模型的复杂度&#xf…...

修改IDEA配置导致Spring Boot项目读取application.properties中文乱码问题

之前很多配置都是放在nacos里面&#xff0c;然后这次同事有个配置写在application.properties中&#xff0c;这个配置含有中文&#xff0c;启动之后发现拿到的中文值会乱码&#xff0c;然后就帮忙看了一下问题。 排查问题 经过不停的百度、排查发现&#xff0c;spring读取app…...

Flink 热存储维表 使用 Guava Cache 减轻访问压力

目录 背景 Guava Cache 简介 实现方案 1. 项目依赖 2. Guava Cache 集成到 Flink (1) 定义 Cache (2) 使用 Cache 优化维表查询 3. 应用运行效果 (1) 维表查询逻辑优化 (2) 减少存储压力 Guava Cache 配置优化 总结 背景 在实时计算场景中&#xff0c;Flink 应用中…...

深入探索SenseVoiceSmall:高效多语言语音识别与处理模型

引言 随着人工智能技术的飞速发展&#xff0c;语音识别技术已经广泛应用于智能助手、客户服务、智能家居等多个领域。然而&#xff0c;现有的语音识别模型往往存在资源消耗大、多语言支持不足等问题。今天&#xff0c;我们要介绍的是来自ModelScope平台的SenseVoiceSmall模型&…...

Flink--API 之Transformation-转换算子的使用解析

目录 一、常用转换算子详解 &#xff08;一&#xff09;map 算子 &#xff08;二&#xff09;flatMap 算子 &#xff08;三&#xff09;filter 算子 &#xff08;四&#xff09;keyBy 算子 元组类型 POJO &#xff08;五&#xff09;reduce 算子 二、合并与连接操作 …...

每日十题八股-2024年11月27日

1.类型互转会出现什么问题吗&#xff1f; 2.为什么用bigDecimal 不用double &#xff1f; 3.装箱和拆箱是什么&#xff1f; 4.Java为什么要有Integer&#xff1f; 5.Integer相比int有什么优点&#xff1f; 6.那为什么还要保留int类型&#xff1f; 7.说一下 integer的缓存 8.怎么…...

OpenCV截取指定图片区域

import cv2 img cv2.imread(F:/2024/Python/demo1/test1/man.jpg) cv2.imshow(Image, img) # 显示图片 #cv2.waitKey(0) # 等待按键x, y, w, h 500, 100, 200, 200 # 示例坐标 roi img[y:yh, x:xw] # 截取指定区域 cv2.imshow(ROI, roi) cv2.waitKey(0) cv…...

Java部分新特性

模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …...

【SpringBoot】28 API接口防刷(Redis + 拦截器)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 常用的 API 安全措施包括&#xff1a;防火墙、验证码、鉴权、IP限制、数据加密、限流、监控、网关等&#xff0c;以确保接口的安全性。 常见措施 1&#xff09;防火墙 防火墙是网络安全中最基本的安全设备之一&#xff0c…...

IT运维专家给年轻人一些职业上的建议

运维工作在现代企业中是非常重要的一环,保证系统的稳定性、可用性以及安全性对企业的正常运营至关重要。以下是我给年轻人的一些职业发展建议,希望能够帮助你们在运维领域找到方向并取得成功。 1. 夯实基础,扎实技术功底 精通操作系统与网络:运维工作需要深入理解操作系统…...

Django基础之路由

一.前言 前面我们说了django的安装于基础配置&#xff0c;基础知识点我就细分下来&#xff0c;每天和大家讲一点&#xff0c;今天就要和大家说django的基础知识点了&#xff0c;我们今天先来讲路由&#xff0c;内容不多&#xff0c;希望大家记住 二.传统路由 路由就是前面一个…...

北京网站建设乐云seo/steam交易链接在哪

i.MX8MM开发板使用手册更新啦&#xff0c;最新版本为1.6版本。后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。更新重点&#xff1a;1 Android源码更新维护&#xff0c;支持4G模块 2 Linux源码修复声卡声音过小问题&#x…...

高古楼网站找活做/网络科技有限公司

Android应用开发--MP3音乐播放器界面设计&#xff08;1&#xff09; 近期突然想自己开发一款MP3播放器&#xff0c;所以就有了上面的界面&#xff0c;小巫不才&#xff0c;为了记录自己的开发过程&#xff0c;写成博客&#xff0c;个人开发可能有很多地方不规范&#xff0c;但学…...

五分钟自己创建网站的方法/优化设计电子课本下载

简介&#xff1a; 1.RTMP(实时消息传输协议)是Adobe 公司开发的一个基于TCP的应用层协议。 2.RTMP协议中基本的数据单元称为消息&#xff08;Message&#xff09;。 3.当RTMP协议在互联网中传输数据的时候&#xff0c;消息会被拆分成更小的单元&#xff0c;称为消息块&#xff…...

wordpress会员制订阅/广告网站策划方案

三种事件绑定方法总结1、多种事件绑定方式汇总2、源代码1、多种事件绑定方式汇总 组件对象的绑定 通过 command 属性绑定&#xff08;适合简单不需获取 event 对象&#xff09;Button(window, text "login", command login)通过 bind 方法绑定&#xff08;适合需…...

郑州小程序开发多少钱/宁波seo营销

C中的::的作用 2018-06-08 13:47:46 一米阳光-ing 阅读数 8036更多 分类专栏&#xff1a; C/C (1)作用域限定符&#xff0c;当在类体中直接定义函数时&#xff0c;不需要在函数名字的前面加上类名&#xff0c;但是在类体外实现函数定义的时候&#xff0c;必须加上类名并且加…...

宁波免费做网站/宁波seo优化公司

绘制环境 getContext(2d)&#xff1a;目前只支持2d场景不能在样式里设置宽高&#xff0c;否则变成等比缩放&#xff08;包括里面画的内容也会等比缩放&#xff09; 复制代码 绘制图形&#xff1a; 绘制方块&#xff1a;fillRect(L,T,W,H); 填充的方块strokeRect(L,T,W,H); 带边…...