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: 输出文件
栗子
-
变量替换
# 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" -
条件替换
# 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 是 TRUEadd_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 - source_dir: 子目录中
主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更新了一些新的内容,我都还没有一个一个仔细去看,但是还是有必要去解读一下新内容的。就先从Teleport 开始吧。 官方对 Teleport 的解释是:<Teleport> 是一个内置组件,它可以将一个组件内部的一部分模板“传…...
ue5第三人称闯关游戏学习(一)
视频资料38 - Compilers and Editors_哔哩哔哩_bilibili 上一个第一人称射击项目做完 接下来要更深入学习。 引入资产与C来创建第三人称闯关游戏 这次要引入的资产有两个分别是 Unreal Learning Kit: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中有个方法:(LoginUserRequest是一个用户类对象) PostMapping("/test/phone")public Result validPhone(LoginUserRequest loginUserRequest) {return Result.success(loginUserRequest);}现在讨论Param("login…...
手搓人工智能-最优化算法(1)最速梯度下降法,及推导过程
“Men pass away, but their deeds abide.” 人终有一死,但是他们的业绩将永存。 ——奥古斯坦-路易柯西 目录 前言 简单函数求极值 复杂函数梯度法求极值 泰勒展开 梯度,Nabla算子 Cauchy-Schwarz不等式 梯度下降算法 算法流程 梯度下降法…...
多目标优化算法——多目标粒子群优化算法(MOPSO)
Handling Multiple Objectives With Particle Swarm Optimization(多目标粒子群优化算法) 一、摘要: 本文提出了一种将帕累托优势引入粒子群优化算法的方法,使该算法能够处理具有多个目标函数的问题。与目前其他将粒子群算法扩展…...
Swift——自动引用计数ARC
ARC ARC是swift使用的一种管理应用程序内存的机制,对于C语言我们知道,当我们申请一块空间,通常需要手动释放,不然会造成空间浪费,而有了ARC机制,你无需考虑内存的管理,因为ARC会在类的实例不再…...
【Quarkus】基于CDI和拦截器实现AOP功能(进阶版)
Quarkus 基于CDI和拦截器实现AOP功能(进阶版) 拦截器的属性成员拦截器的重复使用基于属性成员和重复使用的拦截器的发消息案例 本节来了解一下拦截器高级特性(拦截器的重复使用和属性成员),官网说明:https:…...
【踩坑日记】【教程】如何在ubuntu服务器上配置公钥登录以及bug解决
前言 在日常开发和运维中,为了提高服务器登录的安全性,我们通常会选择使用 SSH 密钥认证 来替代传统的密码登录。然而,在配置 SSH 公钥登录的过程中,可能会遇到各种坑和 Bug。本文将从零开始,手把手教你如何在 Ubuntu…...
insmod一个ko提供基础函数供后insmod的ko使用的方法
一、背景 在内核模块开发时,多个不同的内核模块,有时候可能需要都共用一些公共的函数,比如申请一些平台性的公共资源。但是,这些公共的函数又不方便去加入到内核镜像里,这时候就需要把这些各个内核模块需要用到的一些…...
七、传统循环神经网络(RNN)
传统循环神经网络 RNN 前言一、RNN 是什么?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学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:19.删除链表倒数第N个节点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表…...
【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. 外部中断
更多单片机学习笔记:单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…...
基于stm32的智能教室管理系统/智能家居系统
基于stm32的智能教室管理系统/智能家居系统 持续更新,欢迎关注!!! ** 基于stm32的智能教室管理系统/智能家居系统 ** 目前,物联网已广泛应用在我们的生活中。智慧校园是将校园中的生活、学习、工作等相关的资源联系在一起,实现管理的智能化…...
基于 Qt 和 GStreamer 的环境中构建播放器
一、功能与需求分析 功能描述 播放本地视频文件(如 MP4、MKV)。 支持基本控制功能(播放、暂停、停止、跳转)。 提供音量调节功能。 在 Windows 环境下使用 Visual Studio 2022 编译。 技术选型 Qt:用于构建用户界面。 GStreamer:负责视频解码和播放。 Visual Studio 202…...
windows docker 入门
这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步:安装Docker Desktop for Windows 系统要求: Windows 10 64位版本(专业版、企业版或教育版)。启用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 解决方法: <dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring…...
深度学习中的正则化模型是什么意思?
一、定义 在深度学习中,正则化是一种用于防止过拟合的技术。过拟合是指模型在训练数据上表现非常好,但在新的、未见过的数据(测试数据)上表现很差的情况。正则化模型就是通过在损失函数中添加额外的项来约束模型的复杂度…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
