CMake解析参数用法示例
cmake_parse_arguments
是 CMake 中用于解析函数或宏参数的工具,特别适合处理带有选项(OPTIONS
)、单值参数(SINGLE_ARGS
)和多值参数(MULTI_ARGS
)的复杂参数列表。以下是用法说明和一个示例:
基本语法
cmake_parse_arguments(<PREFIX> # 解析后变量的前缀"<OPTIONS>" # 选项列表(如 --enable-foo)"<SINGLE_ARGS>" # 单值参数列表(如 --key VALUE)"<MULTI_ARGS>" # 多值参数列表(如 --files a.txt b.txt)${ARGN} # 需要解析的参数(通常用 ${ARGN})
)
解析后,可以通过以下变量访问参数:
- 选项:
${<PREFIX>_<OPTION_NAME>}
(值为TRUE
/FALSE
) - 单值参数:
${<PREFIX>_<SINGLE_ARG_NAME>}
- 多值参数:
${<PREFIX>_<MULTI_ARG_NAME>}
示例
假设我们需要定义一个宏 setup_project
,支持以下参数:
- 选项:
ENABLE_TEST
(是否启用测试) - 单值参数:
VERSION
(项目版本号) - 多值参数:
SOURCES
(源文件列表)
代码实现
# 定义宏
macro(setup_project)# 解析参数set(OPTIONS "ENABLE_TEST") # 选项列表set(SINGLE_ARGS "VERSION") # 单值参数列表set(MULTI_ARGS "SOURCES") # 多值参数列表cmake_parse_arguments("ARG" # 前缀为 ARG"${OPTIONS}""${SINGLE_ARGS}""${MULTI_ARGS}"${ARGN} # 传入宏的参数)# 检查是否有未解析的参数(可选)if(ARG_UNPARSED_ARGUMENTS)message(WARNING "Unknown arguments: ${ARG_UNPARSED_ARGUMENTS}")endif()# 处理选项if(ARG_ENABLE_TEST)message(STATUS "Testing enabled")# 添加测试相关逻辑...endif()# 处理单值参数if(ARG_VERSION)message(STATUS "Project version: ${ARG_VERSION}")else()message(FATAL_ERROR "VERSION must be specified!")endif()# 处理多值参数if(ARG_SOURCES)message(STATUS "Source files: ${ARG_SOURCES}")# 添加编译目标...add_executable(my_app ${ARG_SOURCES})else()message(FATAL_ERROR "SOURCES must be specified!")endif()
endmacro()# 调用示例
setup_project(ENABLE_TESTVERSION 1.0.0SOURCES src/main.cpp src/utils.cpp
)
输出结果
-- Testing enabled
-- Project version: 1.0.0
-- Source files: src/main.cpp;src/utils.cpp
注意事项
- 变量作用域:如果使用
macro
而非function
,解析后的变量会影响父作用域。建议在函数中使用function
+PARENT_SCOPE
控制作用域。 - 参数顺序:CMake 不关心参数顺序,但需要确保参数名和值正确匹配。
- 未解析参数:通过
${<PREFIX>_UNPARSED_ARGUMENTS}
可以捕获未知参数。
通过 cmake_parse_arguments
,你可以更灵活地处理 CMake 函数/宏的复杂参数!
你提到的这一点非常重要!在 CMake 中,宏(macro)和函数(function)的行为有本质区别(尤其是作用域规则不同)。以下我会详细解释它们的差异,并给出一个函数的例子,同时说明为何在之前的回答中选择了宏。
为什么先用了宏(macro)的例子?
-
简化示例:
在简单的示例中,宏的变量作用域规则(直接修改父作用域)可以让代码更简洁,不需要额外处理变量传递。对于新手来说,这可能更容易理解。 -
历史原因:
早期 CMake 版本中,cmake_parse_arguments
在函数中的行为需要更谨慎的作用域处理,而宏的行为更“直接”。
但实际项目中,**函数(function)**通常是更安全的选择,因为它能隔离作用域,避免变量污染。
函数(function)的示例
以下是将之前的 setup_project
从宏改为函数的实现,并修复作用域问题:
代码实现
# 定义函数
function(setup_project)# 解析参数set(OPTIONS "ENABLE_TEST") # 选项列表set(SINGLE_ARGS "VERSION") # 值参数列表set(MULTI_ARGS "SOURCES") # 多值参数列表cmake_parse_arguments("ARG" # 前缀为 ARG"${OPTIONS}""${SINGLE_ARGS}""${MULTI_ARGS}"${ARGN} # 传入函数的参数)# 检查未解析的参数(可选)if(ARG_UNPARSED_ARGUMENTS)message(WARNING "Unknown arguments: ${ARG_UNPARSED_ARGUMENTS}")endif()# 处理选项if(ARG_ENABLE_TEST)message(STATUS "Testing enabled")# 启用测试逻辑(例如 include(CTest))endif()# 处理单值参数if(NOT ARG_VERSION)message(FATAL_ERROR "VERSION must be specified!")endif()message(STATUS "Project version: ${ARG_VERSION}")# 处理多值参数if(NOT ARG_SOURCES)message(FATAL_ERROR "SOURCES must be specified!")endif()message(STATUS "Source files: ${ARG_SOURCES}")# 关键点:将变量传递到父作用域(如果需要影响外部)# 例如,将源文件列表传递给父作用域:set(SOURCES ${ARG_SOURCES} PARENT_SCOPE)# 在函数内创建目标(变量直接可见)add_executable(my_app ${ARG_SOURCES})
endfunction()# 调用示例
setup_project(ENABLE_TESTVERSION 1.0.0SOURCES src/main.cpp src/utils.cpp
)
宏(macro) vs 函数(function)的关键区别
特性 | 宏(macro) | 函数(function) |
---|---|---|
作用域 | 直接修改父作用域的变量 | 默认只在函数内部作用域有效 |
变量传递 | 自动“泄漏”到父作用域 | 需显式使用 set(... PARENT_SCOPE) |
性能 | 类似代码替换,可能更高效 | 有独立作用域,稍复杂 |
安全性 | 容易污染父作用域变量 | 隔离作用域,更安全 |
为什么推荐使用函数?
-
避免变量污染:
函数不会意外覆盖父作用域的变量(例如,如果父作用域中已经有一个VERSION
变量,宏可能会直接修改它,而函数不会)。 -
逻辑隔离:
函数内部的操作(如add_executable
)默认只在函数作用域内生效,除非显式传递变量到父作用域。 -
可维护性:
函数的隔离性使得代码行为更可预测,适合复杂项目。
何时使用宏?
- 需要直接修改父作用域:
例如,在顶层脚本中快速操作变量。 - 简单代码替换:
当逻辑非常简单且不需要隔离作用域时。
总结
- 如果你的目标是封装一个可复用的逻辑模块,优先使用函数。
- 如果示例中使用了宏,可以补充一个函数的版本,明确说明作用域处理的差异。这样用户可以根据实际需求选择。
这段代码的目的是通过两次调用 cmake_parse_arguments
实现一种嵌套参数解析的机制。它的核心思路是:先解析外层的“元参数”(定义如何解析内层参数),再用这些元参数去解析实际传递的参数。以下是对代码的详细解释,以及这种设计的优缺点分析。
代码解释
function(nuttx_parse_function_args)cmake_parse_arguments(IN "" "FUNC""OPTIONS;ONE_VALUE;MULTI_VALUE;REQUIRED;ARGN" "${ARGN}")cmake_parse_arguments(OUT "${IN_OPTIONS}" "${IN_ONE_VALUE}""${IN_MULTI_VALUE}" "${IN_ARGN}")if(OUT_UNPARSED_ARGUMENTS)message(FATAL_ERROR "${IN_NAME}: unparsed ${OUT_UNPARSED_ARGUMENTS}")endif()foreach(arg ${IN_OPTIONS} ${IN_ONE_VALUE} ${IN_MULTI_VALUE})set(${arg}${OUT_${arg}}PARENT_SCOPE)endforeach()endfunction()
1. 函数定义
function(nuttx_parse_function_args)
定义了一个名为 nuttx_parse_function_args
的函数,目的是封装一个通用的参数解析工具。
2. 第一次解析:cmake_parse_arguments(IN ...)
cmake_parse_arguments(IN "" # 外层无选项(OPTIONS)"FUNC" # 外层单值参数(SINGLE_ARGS)"OPTIONS;ONE_VALUE;MULTI_VALUE;REQUIRED;ARGN" # 外层多值参数(MULTI_ARGS)"${ARGN}" # 输入的参数列表
)
- 目的:解析外层的“元参数”,这些参数定义了如何解析内层的实际参数。
- 解析结果:
IN_FUNC
: 单值参数,表示实际要解析的函数名(可能用于错误提示)。IN_OPTIONS
: 多值参数,定义内层参数的选项(OPTIONS
)。IN_ONE_VALUE
: 多值参数,定义内层参数的单值参数(SINGLE_ARGS
)。IN_MULTI_VALUE
: 多值参数,定义内层参数的多值参数(MULTI_ARGS
)。IN_ARGN
: 多值参数,保存实际需要解析的内层参数列表。
3. 第二次解析:cmake_parse_arguments(OUT ...)
cmake_parse_arguments(OUT "${IN_OPTIONS}" # 内层选项(来自第一次解析的 IN_OPTIONS)"${IN_ONE_VALUE}" # 内层单值参数(来自第一次解析的 IN_ONE_VALUE)"${IN_MULTI_VALUE}" # 内层多值参数(来自第一次解析的 IN_MULTI_VALUE)"${IN_ARGN}" # 实际需要解析的参数(来自第一次解析的 IN_ARGN)
)
- 目的:用第一次解析得到的元参数(
IN_OPTIONS
,IN_ONE_VALUE
,IN_MULTI_VALUE
)去解析实际的内层参数(IN_ARGN
)。 - 解析结果:
OUT_<OPTION>
: 内层选项的值(TRUE
/FALSE
)。OUT_<SINGLE_ARG>
: 内层单值参数的值。OUT_<MULTI_ARG>
: 内层多值参数的值。
4. 错误检查
if(OUT_UNPARSED_ARGUMENTS)message(FATAL_ERROR "${IN_NAME}: unparsed ${OUT_UNPARSED_ARGUMENTS}")
endif()
- 检查是否有未解析的参数,如果有则报错。
5. 将解析结果传递到父作用域
foreach(arg ${IN_OPTIONS} ${IN_ONE_VALUE} ${IN_MULTI_VALUE})set(${arg}${OUT_${arg}}PARENT_SCOPE)
endforeach()
- 将内层解析得到的参数值(
OUT_<arg>
)传递到父作用域,使得调用者可以访问这些参数。
为什么使用两次解析?
这种设计的关键在于动态定义参数解析规则:
- 外层解析:定义内层参数的解析规则(哪些是选项、单值参数、多值参数)。
- 内层解析:根据外层解析得到的规则,解析实际的参数列表。
例如,假设调用代码如下:
nuttx_parse_function_args(FUNC my_functionOPTIONS ENABLE_FOOONE_VALUE VERSIONMULTI_VALUE SOURCESARGN ENABLE_FOO VERSION 1.0.0 SOURCES a.cpp b.cpp
)
- 外层解析会提取
OPTIONS ENABLE_FOO
,ONE_VALUE VERSION
,MULTI_VALUE SOURCES
,并将ENABLE_FOO VERSION 1.0.0 SOURCES a.cpp b.cpp
保存到IN_ARGN
。 - 内层解析会根据外层解析的规则,将
ENABLE_FOO
解析为选项,VERSION
解析为单值参数,SOURCES
解析为多值参数。
优点
- 灵活性:
允许动态指定参数解析规则,可以复用同一个函数解析不同结构的参数。 - 通用性:
适合需要为多个函数或宏统一封装参数解析逻辑的场景。 - 减少重复代码:
避免在每个函数中重复编写cmake_parse_arguments
。
缺点
- 复杂度高:
嵌套解析逻辑难以理解,尤其是对 CMake 新手。 - 依赖外层参数的正确性:
如果外层参数(如OPTIONS
,ONE_VALUE
)未正确传递,内层解析会失败。 - 错误处理困难:
嵌套解析可能导致错误信息不直观(例如,外层参数错误和内层参数错误混杂)。 - 变量作用域问题:
需要显式传递变量到父作用域,容易遗漏或出错。
改进建议
- 添加注释:
明确说明两次解析的目的,尤其是外层参数的含义。 - 严格的错误检查:
在外层解析后检查必要的元参数(如FUNC
,OPTIONS
是否存在)。 - 示例和文档:
提供调用示例和文档,说明如何正确传递外层和内层参数。 - 简化设计:
如果不需要动态定义解析规则,应优先使用单次cmake_parse_arguments
。
总结
这段代码通过两次 cmake_parse_arguments
实现了一种动态参数解析机制,虽然灵活但复杂度较高。在实际项目中,应权衡灵活性和可维护性:如果不需要动态指定解析规则,应避免嵌套解析;若必须使用,需确保充分的错误处理和文档支持。
相关文章:
CMake解析参数用法示例
cmake_parse_arguments 是 CMake 中用于解析函数或宏参数的工具,特别适合处理带有选项(OPTIONS)、单值参数(SINGLE_ARGS)和多值参数(MULTI_ARGS)的复杂参数列表。以下是用法说明和一个示例&…...
开源项目实战学习之YOLO11:ultralytics-cfg-models-fastsam(九)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 1. __init__.py2. model.py3. predict.py4. utils.py5. val.py FastSAM 是一种目标检测和图像分割模型,Ultralytics 是一个在计算机视觉领域广泛使用的库&#x…...
使用frpc链接内网的mysql
以下是配置 frpc 连接内网 MySQL 服务的详细步骤: 1. 准备工作 frps 服务器:已部署在公网 IP 11.117.11.245,假设 frps 的默认端口为 7000。 内网 MySQL 服务:运行在内网机器的 3306 端口。 目标:通过公网 IP 11.117…...
分享:VTK版本的选择 - WPF空域问题
在早期版本中,ActiViz 对 Windows Presentation Foundation (WPF) 框架的支持是通过 WindowsFormHost 组件实现的,这种方式依赖于 WindowsForm 和 WPF 的互操作性。然而,这种方法存在一个众所周知的“空域问题”(airspace issue&a…...
MIPS架构详解:定义、应用与其他架构对比
一、MIPS架构的定义 MIPS(Microprocessor without Interlocked Pipeline Stages) 是一种经典的精简指令集(RISC)处理器架构,由斯坦福大学John Hennessy团队于1981年提出,强调高效流水线设计和硬件简化。 核…...
项目剖析:基于Agent的个人知识管理系统如何设计
为什么写这篇文章?最近在思考如果想要构建一个个人知识管理的Agent应该怎样设计才好,然后最近看到这样一个项目,就想剖析一下它的架构,看一下它的设计思想。然后一些剖析得过程就沉淀到本文当中。本文档主要从整体架构、dataflow的视角剖析khoj项目,分析应该一个知识管理A…...
Python魔法函数深度解析
一、魔法函数是什么? 魔法函数(Magic Methods)是Python中以双下划线(__xx__)包裹的特殊方法,它们为类提供了一种与Python内置语法深度集成的能力。这些方法由解释器自动调用,无需显式调用&…...
PCB设计工艺规范(一)概述
PCB设计工艺规范(一) 1.概述2.关键词及引用标准3.PCB板材要求3.1 确定PCB使用板材以及TG值3.2 确定 PCB 的表面处理镀层 4.热设计要求5.器件库选项要求 资料来自网络,仅供学习使用。 1.概述 规范产品的 PCB 工艺设计,规定 PCB 工…...
Github开通第三方平台OAuth登录及Java对接步骤
调研起因: 准备搞AI Agent海外项目,有相当一部分用户群体是程序员,所以当然要接入Github这个全球最大的同性交友网站了,让用户使用Github账号一键完成注册或登录。 本教程基于Web H5界面进行对接,同时也提供了spring-…...
DeepSeek V1:初代模型的架构与性能
DeepSeek V1(又称DeepSeek-MoE)是DeepSeek系列的首代大规模语言模型,它采用Transformer结合稀疏混合专家(MoE)的创新架构,实现了在受控算力下的大容量模型。本文将深入解析DeepSeek V1的架构设计与技术细节,包括其关键机制、训练优化策略,以及在各类NLP任务上的表现。 …...
Java ResourceBundle 资源绑定详解
Java ResourceBundle 资源绑定详解 ResourceBundle 是 Java 提供的国际化(i18n)资源管理工具,位于 java.util 包。它专门用于加载本地化的 .properties 资源文件,支持多语言切换,是国际化和本地化开发的核心类。 1. 核心特性 (1)基本特点 基于 .properties 文件管理键…...
flutter 专题 六十一 支持上拉加载更多的自定义横向滑动表格
在股票软件中,经常会看到如下所示的效果(ps:由于公司数据敏感,所以使用另一个朋友的一个图)。 分析需要后,我先在网上找了下支持横向滑动的组件,最后找到了这个:flutter_horizontal…...
暗夜模式续
之前写过一篇笨拙的方式实现暗夜模式,但是当真正去适配的时候发现简直恶心至极;然后想通过一些方式可以把笨拙的方式变得优雅; 之前实现暗夜模式的快速通道,这篇文章在基于这个基础上优化而来 目录 背景 优化步骤 OK…...
[吾爱出品] 文件夹迁移工具(DirMapper)
文件夹迁移工具(DirMapper) 链接:https://pan.xunlei.com/s/VOP4Uf6vu3dalYLaZ1iZUhJ1A1?pwdfhzi# 文件夹迁移工具(DirMapper) 智能识别源文件夹分类 复制/移动两种迁移模式 冲突解决方案(覆盖/跳过/合…...
DeepSeek 4月30日发布新模型:DeepSeek-Prover-V2-671B 可进一步降低数学AI应用门槛,推动教育、科研领域的智能化升级
DeepSeek-Prover-V2-671B模型特点: 一、超大参数规模与数学推理能力 参数规模跃升 模型参数量高达6710亿,是前代数学推理模型Prover-V1.5(70亿参数)的近100倍,表明其具备更强的复杂问题处理能力。 前代Prover-V1.5在高…...
GitHub修炼法则:第一次提交代码教学(Liunx系统)
前言 github是广大程序员们必须要掌握的一个技能,万事开头难,如果成功提交了第一次代码,那么后来就会简单很多。网上的相关资料往往都不是从第一次开始,导致很多新手们会在过程中遇到很多权限认证相关的问题,进而被卡…...
百家号等新媒体私信入口是否可以聚合到企业微信的客服,如何实现
一、技术实现路径 1. 百家号 API 对接 接口权限申请: 登录百度开发者平台,创建应用并获取 API 密钥(app_id和app_token)。申请私信相关接口权限(如消息通知、粉丝查询),需满足百家号的审核要求…...
【来自AI】RS485,Rs232,Modbus的区别和联系是什么
RS485、RS232 和 Modbus 是常用于工业自动化和通信中的技术标准,它们有不同的特点和应用。下面是它们的区别和联系: RS232 (Recommended Standard 232) 定义:RS232 是一种串行通信标准,通常用于短距离(一般最多15米&…...
java实现序列化与反序列化
va 实现序列化与反序列化 序列化(Serialization) 是将 Java 对象转换为字节流(二进制数据),以便存储或网络传输。 反序列化(Deserialization) 则是将字节流恢复为 Java 对象。 Java 提供了 ja…...
harmonyOS 手机,双折叠,平板,PC端屏幕适配
由于HarmonyOS设备的屏幕尺寸和分辨率各不相同,开发者需要采取适当的措施来适配不同的屏幕。 1.EntryAbility.ets文件里:onWindowStageCreate方法里判断设备类型, 如果是pad,需全屏展示(按客户需求来,本次…...
Qt Creator环境编译的Release软件放在其他电脑上使用方法
本文解决的问题:将Qt Creator环境编译的exe可执行程序放到其他电脑上不可用情况 1、寻找windeployqt工具所在路径" D:\Qt5.12.10\5.12.10\msvc2015_64\bin" ,将此路径配置到环境变量; 2、用Qt Creator环境编译出Release版本可执行…...
electron+vite+vue3 快速入门教程
Electron、Vite 和 Vue 3 结合使用可以创建强大的跨平台桌面应用程序,下面是一个快速入门教程,帮助你搭建一个基于 Electron Vite Vue 3 的项目。 环境准备 Node.js: 首先确保你的机器上已经安装了 Node.js。你可以通过以下命令来检查是否已安装&…...
添加了addResourceHandlers 但没用
B站黑马的视频 public class WebMvcConfig extends WebMvcConfigurationSupport { /** * 设置静态资源映射 * param registry */ Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { log.info("开始进…...
uniapp如何获取安卓原生的Intent对象
通过第三方app唤起,并且获取第三方app唤起时携带的参数 因为应用a唤起应用b时,应用b第一时间就要拿到参数token,所以需要将获取参数的方法写在APP.vue中的onLaunch钩子里,如果其他地方要用可以选择vuex或者采用本地缓存。 uniapp中plus.run…...
国标GB28181视频平台EasyGBS在物业视频安防管理服务中的应用方案
一、方案背景 在现代物业服务中,高效的安全管理与便捷的服务运营至关重要。随着科技的不断发展,物业行业对智能化、集成化管理系统的需求日益增长。EasyGBS作为一款基于国标GB28181协议的视频监控平台,具备强大的视频管理与集成能力&#…...
Linux容器大师:K8s集群部署入门指南
引言 在云原生时代,Kubernetes就像一位"集群调度大师"🎮,轻松管理成千上万的容器化应用!本文将带你从零开始搭建生产级K8s集群,从基础概念到实战部署,从核心组件到安全运维。无论你是要搭建开发…...
Vue 3 中纯 template 标签
发现 Vue 3 中纯 template 标签不会被渲染。 可以加 v-if"1" 即可 https://andi.cn/page/622155.html...
极光PDF编辑器:高效编辑,轻松管理PDF文档
在日常工作和学习中,PDF文件的使用越来越普遍。无论是学术论文、工作报告还是电子书籍,PDF格式因其稳定性和兼容性而被广泛采用。然而,编辑PDF文件往往比编辑Word文档更加复杂。今天,我们要介绍的 极光PDF编辑器,就是这…...
《可信数据空间 技术架构》技术文件正式发布
可信数据空间 技术架构发布了 国家数据基础设施技术文件发布有几个月了,成为数据要素圈内必读的白皮书,接着今日国家数据局正式发布了《可信数据空间 技术架构》,笔者有幸见证了该文件出炉的过程,在这两个文件重,对数…...
OpenCV 图形API(74)图像与通道拼接函数-----合并三个单通道图像(GMat)为一个多通道图像的函数merge3()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 从3个单通道矩阵创建一个3通道矩阵。 此函数将多个矩阵合并以生成一个单一的多通道矩阵。即,输出矩阵的每个元素将是输入矩阵元素的…...
Redis应用场景实战:穿透/雪崩/击穿解决方案与分布式锁深度剖析
一、缓存异常场景全解与工业级解决方案 1.1 缓存穿透:穿透防御的三重门 典型场景 恶意爬虫持续扫描不存在的用户ID 参数注入攻击(如SQL注入式查询) 业务设计缺陷导致无效查询泛滥 解决方案进化论 第一层防护:布隆过滤器&am…...
负载均衡技术全景指南:架构、算法与发展趋势
负载均衡技术全景指南:架构、算法与发展趋势 一、负载均衡技术概述二、应用层负载均衡(一)HTTP 重定向(二)反向代理服务器 三、传输层负载均衡(一)DNS 域名解析负载均衡(二ÿ…...
DeepSeek-V3 解析第二篇:DeepSeekMoE
这篇文章是我们 DeepSeek-V3 系列的第二篇,聚焦于 DeepSeek 模型 [1, 2, 3] 的一个关键架构突破:DeepSeekMoE。 📚 本文也是我们【LLM 架构演化系列】的第二篇,聚焦 DeepSeek-V3 的 MoE 架构创新。如果你正研究大模型性能优化或架…...
【ArcGISPro学习笔记】布局输出时图例总是有省略号怎么办?
在用ArcGISPro制图时,发现布局输出时图例总是有省略号,例如下图: 调整半天都搞不定,必须把图例框拉很宽才没有省略号,非常影响布局体验 后来发现只需调整一个地方就把省略号弄没了,就是在图例排列这里&…...
驱散养生伪识阴霾,重铸科学养生晴空
在健康意识日益觉醒的当下,养生已然成为人们生活中备受瞩目的焦点。然而,各类养生伪知识如同阴霾,遮蔽了科学养生的光芒,误导着人们的养生实践。只有彻底驱散这些伪识阴霾,才能重铸科学养生的朗朗晴空,让健…...
【补题】Codeforces Round 664 (Div. 1) A. Boboniu Chats with Du
题意:给出n,d,m三个值,分别代表,有多少个值ai,使用超过m的ai,需要禁言d天,如果不足也能使用,m代表区分点,问能得到最大的值有多少。 思路: …...
大语言模型 06 - 从0开始训练GPT 0.25B参数量 - MiniMind 实机配置 GPT训练基本流程概念
写在前面 GPT(Generative Pre-trained Transformer)是目前最广泛应用的大语言模型架构之一,其强大的自然语言理解与生成能力背后,是一个庞大而精细的训练流程。本文将从宏观到微观,系统讲解GPT的训练过程,…...
Java进阶--设计模式
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样࿰…...
同时启动俩个tomcat压缩版
下载解压tomcat压缩版 复制一份,换个名字 更改任意一个tomcat的配置文件用记事本打开 修改三个位置 1.<Server port"8005" shutdown"SHUTDOWN"> 2. <Connector port"8080" protocol"HTTP/1.1" …...
ZYNQ MPSOC之PL与PS数据交互DMA方式
ZYNQ MPSOC之PL与PS数据交互DMA方式 1 摘要 XILINX ZYNQ 以及 ZYNQ MPSOC主要优势在于异构 ARM+FPGA。其中非常关键的一点使用了 AXI 总线进行高速互联。而且这个 AXI 总线是开放给我们用户使用的。在前面的文章中我们详解了使用了AXI-HP方式PL到PS端进行数据交互。本文主要涉…...
Qwen3本地化部署,准备工作:SGLang
文章目录 SGLang安装deepseek运行Qwen3-30B-A3B官网:https://github.com/sgl-project/sglang SGLang SGLang 是一个面向大语言模型和视觉语言模型的高效服务框架。它通过协同设计后端运行时和前端编程语言,使模型交互更快速且具备更高可控性。核心特性包括: 1. 快速后端运…...
一种动态分配内存错误的解决办法
1、项目背景 一款2年前开发的无线网络通信软件在最近的使用过程中出现网络中传感器离线的问题,此软件之前已经使用的几年了,基本功能还算稳定。这次为什么出了问题。 先派工程师去现场调试一下,初步的结果是网络信号弱,并且有个别…...
golang接口和具体实现之间的类型转换
在 Go 语言中,如果你有一个接口类型的变量,并且你知道它的具体实现类型,你可以使用类型断言将其转换为具体类型。类型断言的语法是 value, ok : interfaceVar.(ConcreteType),其中 interfaceVar 是接口变量,ConcreteTy…...
独立站SaaS平台源码搭建全流程指南:从零到部署
一、什么是独立站SaaS? 独立站SaaS(Software as a Service)指通过自主搭建的云平台为用户提供软件服务,与第三方平台(如Shopify)相比,具有以下优势: 完全自主控制:可自…...
零基础学指针2
零基础学指针---大端和小端 零基础学指针---什么是指针 零基础学指针---取值运算符*和地址运算符& 零基础学指针---结构体大小 零基础学指针5---数据类型转换 零基础学指针6---指针数组和数组指针 零基础学指针7---指针函数和函数指针 零基础学指针8---函数指针数组…...
TM1668芯片学习心得二
一、该芯片包括的指令:显示模式设置命令、数据命令设置、地址命令设置、显示控制; 1、显示模式设置 2、数据命令设置 3、地址命令设置 4、显示控制...
[FPGA VIDEO IP] VCU
Xilinx H.264/H.265 Video Codec Unit IP (PG252) 详细介绍 概述 Xilinx LogiCORE™ IP H.264/H.265 Video Codec Unit(VCU,PG252)是一个专为 Zynq UltraScale MPSoC 设备设计的硬件加速视频编解码模块,支持 H.264(A…...
Git从入门到精通-第一章-基础概念
目录 为什么要版本控制? 版本控制系统 本地版本控制系统 集中化的版本控制系统 分布式版本控制系统 Git是什么? 直接记录快照 几乎所有操作都是本地执行 保证完整性 Git一般只添加数据 三种状态! Git的三种状态 Git的三个阶段…...
简单表管理
1.创建表(学生表,课程表,成绩表) --首先创建数据库 STUxxx CREATE DATABASE STU065; USE STU065; --创建学生表 CREATE TABLE SSS065(SNO CHAR(10) NOT NULL PRIMARY KEY, -- 学号SNAME VARCHAR(20) NOT NULL, -- 姓名DEPA VARCHAR(20), -- 系别AGE INT…...
C#静态类与单例模式深度解析(七):从原理到工业级应用实践
一、静态类:全局工具箱的设计艺术 1.1 静态类的本质特性 public static class MathUtils {// 静态字段(线程安全需自行处理)public static readonly double GoldenRatio = 1.618;// 静态方法public static double CircleArea(double radius){return Math.PI * radius * ra…...