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: 要链接的包名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/479812.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

C++设计模式——Singleton单例模式

一、单例模式的定义 单例模式&#xff0c;英文全称Singleton Pattern&#xff0c;是一种创建型设计模式&#xff0c;它保证一个类在程序中仅有一个实例&#xff0c;并对外提供一个访问的该类实例的全局接口。 单例模式通常用于需要控制对象资源的开发场景&#xff0c;一个类…

Python学习35天

# 定义父类 class Computer: CPUNone MemoryNone diskNone def __init__(self,CPU,Memory,disk): self.disk disk self.Memory Memory self.CPU CPU def get_details(self): return f"CPU:{self.CPU}\tdisk:{self.disk}\t…

<项目代码>YOLOv8 停车场空位识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

mac下Gpt Chrome升级成GptBrowser书签和保存的密码恢复

cd /Users/自己的用户名/Library/Application\ Support/ 目录下有 GPT\ Chrome/ Google/ GptBrowser/ GPT\ Chrome 为原来的chrome浏览器的文件存储目录. GptBrowser 为升级后chrome浏览器存储目录 书签所在的文件 Bookmarks 登录账号Login 相关的文件 拷贝到GptBrow…

GB28181系列二:SIP信令

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、SIP报文介绍 二、SIP交互流程&#xff1a; 1、Session Model 2、Pager Model 3、SIP信令交互过程中的3个定义 三、媒体传输&#xff08;SDP和RTP&#xff09; 一、SIP报文介绍 这里将会介绍SIP…

ViSTa:一个包含4000多个视频和逐步描述的层次化数据集,用于评估VLMs在不同复杂性任务中的表现。

2024-11-22&#xff0c;由Google DeepMind和MATS机构创建的ViSTa数据集&#xff0c;为评估视觉语言模型&#xff08;VLMs&#xff09;在理解基于顺序的任务方面的能力提供了新的视角&#xff0c;这对于强化学习中的成本降低和安全性提升具有重要意义。 数据集地址&#xff1a;…

区块链:波场-TRON链

注意: 1、调试时请将所有的API地址都换成 https://api.trongrid.io 以免报错等问题 https://api.trongrid.io 主网 (Mainnet) 适用于生产环境 https://api.shasta.trongrid.io 测试网 (Shasta) 适用于开发者测试 https://nile.trongrid.io 测试网 (Nile) …

【适配】屏幕拖拽-滑动手感在不同分辨率下的机型适配

接到一个需求是类似下图的3D多房间视角&#xff0c;需要拖拽屏幕 问题 在做这种屏幕拖拽的时候发现&#xff0c;需要拖拽起来有跟手的感觉&#xff0c;会存在不同分辨率机型的适配问题。 即&#xff1a;美术调整好了机型1的手感&#xff0c;能做到手指按下顶层地板上下挪动&…

比特币libsecp256k1中safegcd算法形式化验证完成

1. 引言 比特币和其他链&#xff08;如 Liquid&#xff09;的安全性取决于 ECDSA 和 Schnorr 签名等数字签名算法的使用。Bitcoin Core 和 Liquid 都使用名为 libsecp256k1 的 C 库来提供这些数字签名算法&#xff0c;该库以其所运行的椭圆曲线命名。这些算法利用一种称为modu…

『VUE』elementUI dialog的子组件created生命周期不刷新(详细图文注释)

目录 1. 测试代码分析令人迷惑的效果 分析原因解决方法 如何在dialog中反复触发created呢?总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 主要是在做表单的时候想要有一个编辑表单在dialog弹窗中出现,同时dialog调用的封装的…

深入探讨 Redis 持久化机制:原理、配置与优化策略

文章目录 一、引言二、Redis持久化概述三、RDB&#xff08;Redis DataBase&#xff09;持久化1、RDB概念与工作原理2、RDB的配置选项3、RDB优化配置项4、RDB的优势与劣势 三、AOF&#xff08;Append-Only File&#xff09;持久化1、AOF概念与工作原理2、AOF的三种写回策略3、Re…

使用爬虫时,如何确保数据的准确性?

在数字化时代&#xff0c;数据的准确性对于决策和分析至关重要。本文将探讨如何在使用Python爬虫时确保数据的准确性&#xff0c;并提供代码示例。 1. 数据清洗 数据清洗是确保数据准确性的首要步骤。在爬取数据后&#xff0c;需要对数据进行清洗&#xff0c;去除重复、无效和…

(计算机网络)期末

计算机网络概述 物理层 信源就是发送方 信宿就是接收方 串行通信--一次只发一个单位的数据&#xff08;串行输入&#xff09; 并行通信--一次可以传输多个单位的数据 光纤--利用光的反射进行传输 传输之前&#xff0c;要对信源进行一个编码&#xff0c;收到信息之后要进行一个…

111. UE5 GAS RPG 实现角色技能和场景状态保存到存档

实现角色的技能存档保存和加载 首先&#xff0c;我们在LoadScreenSaveGame.h文件里&#xff0c;增加一个结构体&#xff0c;用于存储技能相关的所有信息 //存储技能的相关信息结构体 USTRUCT(BlueprintType) struct FSavedAbility {GENERATED_BODY()//需要存储的技能UPROPERT…

Js-对象-04-Array

重点关注&#xff1a;Array String JSON BOM DOM Array Array对象时用来定义数组的。常用语法格式有如下2种&#xff1a; 方式1&#xff1a; var 变量名 new Array(元素列表); 例如&#xff1a; var arr new Array(1,2,3,4); //1,2,3,4 是存储在数组中的数据&#xff0…

【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序

DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 1. 窗口的划分 1.1 窗口分为&#xff1a;基于时间的窗口 和 基于数量的窗口 基于时间的窗口&#xff1a;基于起始时间戳 和终止时间戳来决定窗口的大小 基于数量的窗口&#xff1a;根据固定的数量定义窗口 的大小 这…

Java代码操作Zookeeper(使用 Apache Curator 库)

1. Zookeeper原生客户端库存在的缺点 复杂性高&#xff1a;原生客户端库提供了底层的 API&#xff0c;需要开发者手动处理很多细节&#xff0c;如连接管理、会话管理、异常处理等。这增加了开发的复杂性&#xff0c;容易出错。连接管理繁琐&#xff1a;使用原生客户端库时&…

linux系统下如何将xz及ISO\img等格式压缩包(系统)烧写到优盘(TF卡)

最近用树莓派做了个NAS&#xff0c;效果一般&#xff0c;缺少监控及UI等&#xff0c;详细见这篇文章&#xff1a; https://blog.csdn.net/bugsycrack/article/details/135344782?spm1001.2014.3001.5501 所以下载了专门的基于树莓派的NAS系统直接使用。这篇文章是顺便复习一…

带有悬浮窗功能的Android应用

android api29 gradle 8.9 要求 布局文件 (floating_window_layout.xml): 增加、删除、关闭按钮默认隐藏。使用“开始”按钮来控制这些按钮的显示和隐藏。 服务类 (FloatingWindowService.kt): 实现“开始”按钮的功能&#xff0c;点击时切换增加、删除、关闭按钮的可见性。处…