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

【征程 6】工具链 VP 示例中 Cmakelists 解读

1. 引言

在文章【征程 6】VP 简介与单算子实操中,介绍了 VP 是什么,并以单算子 rotate 为例,介绍了 VP API 使用方法。在【征程 6】工具链 VP 示例中日志打印解读 中介绍了 VP 单算子示例中用到的日志打印的头文件应该怎么写。接下来和大家一起看一下 Cmakelists 在 VP 示例中扮演的角色。

作为对 C++不那么熟悉的伙伴,可能会好奇:Cmakelists.txt 怎么写?当有多层 Cmakelists.txt 时,他们的调用关系是什么?由于本人是属于对 C++不那么熟悉的同学,下面会从我的视角来介绍这个问题,如果其中有错误或表述不当的地方,欢迎评论指正。

本文是为了服务于另外一篇文章:【征程 6】工具链 VP 示例为什么能运行。

2. 基础知识

写一段 c++代码,怎么才能跑起来呢?

简单来说,需要在开发机上编译生成可执行文件,然后将可执行文件(bin)和相关依赖(lib,动静态链接库)拷贝到开发板上,执行“可执行文件”即可。

补充解释一下动静态链接库:

静态(函数)库 扩展名为(。a 或。lib, .a 是 linux 侧,。lib 是 windows 侧),静态库在编译时,会直接整合到目标程序中,编译出来的文件会比较大。

  • 优点:编译出的可执行文件 可以独立运行,不再需要向外部要求读取函数库的内容。
  • 缺点:从升级难易度来看没有优势,如果函数库更新,需要重新编译。

动态(函数)库 扩展名为(。so 或。dll, .so 是 linux 侧,。dll 是 windows 侧),动态库在编译时,在程序里只有一个“指向”的位置,也就是说,当可执行文件需要使用到 函数库 中的内容时,程序才会去读取 函数库 来使用。

  • 优点:方便产品功能升级,只要替换对应动态库即可,不必重新编译整个可执行文件。
  • 缺点:可执行文件无法单独运行。

在构建稍微规范/复杂点的 C++项目时,通常会用到 CmakeList,下面来看一下。

2.1 代码结构

构建一个简单但典型的 case 来说明一个 C++项目的调用运行逻辑,项目结构如下:

./
│── CMakeLists.txt       # 顶层 CMakeLists.txt
│── src/                 # 源代码目录
│   ├── CMakeLists.txt   # 子目录 CMakeLists.txt
│   ├── main.cpp         # 主程序
│   ├── main.h           # 头文件
│   ├── module/          # 子模块,如果有的话
│   │   ├── CMakeLists.txt
│   │   ├── module.cpp
│   │   ├── module.h
│── build/               # CMake 编译输出目录,在这个目录里进行编译

在 CMake 项目中,通常会有 顶层 CMakeLists.txt,以及 src 子目录中的 嵌套 CMakeLists.txt,它们共同组织代码的编译流程。CMake 使用 层次化调用,即 顶层 CMakeLists.txt 调用子目录 CMakeLists.txt。编译过程如下:

顶层 CMakeLists.txt: 设置编译选项、添加 src 目录、指定最终目标

src/CMakeLists.txt: 添加 main.cpp 和 main.h、包含子模块

module/CMakeLists.txt: 定义 module.cpp、生成库文件

2.2 CmakeList

  • 最外层 CmakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)    # 定义项目名称set(CMAKE_CXX_STANDARD 11)   # 使用 C++11 标准
# 添加子目录 (调用 src/CMakeLists.txt)
# 让 CMake 进入 src 目录,继续解析 src/CMakeLists.txt
add_subdirectory(src)
# 最终的可执行目标由 src 目录下的 CMakeLists.txt 负责
  • src/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
# 添加子模块 (module 目录), 进入 module 目录,调用 module/CMakeLists.txt
add_subdirectory(module)
# 让编译器找到 module.h
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/module)
# 指定 main.cpp 作为源文件
set(SRC_FILES main.cpp)
# 生成MyExecutable可执行文件
add_executable(MyExecutable ${SRC_FILES})
# 链接 MyModule库, MyModule在module/CMakeLists.txt中定义
target_link_libraries(MyExecutable MyModule)
  • src/module/CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
# 包含当前目录头文件
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
# 编译 module.cpp 为 MyModule 静态库
add_library(MyModule STATIC module.cpp)

2.3 Main

  • main.cpp
#include <iostream>
#include "main.h"
#include "module.h"int main() {std::cout << "Hello, main c++ CMake!" << std::endl;module_function();return 0;
}
  • main.h
#ifndef MAIN_H
#define MAIN_H#endif // MAIN_H

2.4 module

  • module.cpp
#include "module.h"
#include <iostream>void module_function() {std::cout << "Module function called!" << std::endl;
}
  • module.h
#ifndef MODULE_H
#define MODULE_Hvoid module_function();#endif // MODULE_H

2.5 编译与执行

# 进入项目目录
cd ./# 删除旧的 build 目录,重新编译
rm -rf build
mkdir build && cd build# 运行 CMake 配置
cmake ..# 编译
make -j8# 运行可执行文件
./src/MyExecutable

输出:

Hello, main c++ CMake!
Module function called!

3. VP 示例中 Cmakelists

3.1 vp/code/07_single_rotate/CMakelists.txt

在 vp/code/07_single_rotate 目录下的 CMakelists.txt,解读如下:

# 设置 CMake 最低版本,确保兼容性
cmake_minimum_required(VERSION 3.0)
# 定义项目名称为 07_single_rotate
project(07_single_rotate)
# 设置编译选项,添加 -std=c++11 选项,使用 C++11 标准进行编译
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ")# include_directories(...) 指定 头文件搜索路径,用于 编译时查找头文件
include_directories(     ${CMAKE_CURRENT_SOURCE_DIR}/        # 当前源码目录${DEPS_SOURCE_DIR}/ucp/include/     # UCP 组件头文件   ${DEPS_SOURCE_DIR}/hlog/include/    # hlog 日志库${DEPS_SOURCE_DIR}/fmt/include/     # fmt 格式化库${DEPS_SOURCE_DIR}/opencv/include/) # OpenCV 视觉库# 指定库文件 (.so 或 .a) 搜索路径,用于 链接时查找库文件
link_directories(${DEPS_SOURCE_DIR}/ucp/lib${DEPS_SOURCE_DIR}/opencv/lib${DEPS_SOURCE_DIR}/hlog/lib${DEPS_SOURCE_DIR}/fmt/lib${DEPS_SOURCE_DIR}/opencv/lib)        
# 递归搜索 *.cpp 源文件,并存储到 TEST_SRC 变量。
# GLOB_RECURSE 会搜索 当前目录及子目录 的 .cpp 文件。
file(GLOB_RECURSE TEST_SRC *.cpp)
# 创建可执行文件 single_rotate,包含 TEST_SRC 变量中的所有 .cpp 文件
add_executable(single_rotate ${TEST_SRC})
# target_link_libraries(...) 链接所需的库
target_link_libraries(single_rotate hbucp hbvp hlog fmt opencv_world)
# 将 single_rotate 安装到 RELEASE_BIN_DIR 目录。
install(TARGETS single_rotate DESTINATION ${RELEASE_BIN_DIR})
  1. DEPS_SOURCE_DIR 在哪设置的?(3.2 节中设置)
  2. RELEASE_BIN_DIR 在哪设置的?(3.2 节中设置)

带着这 2 个疑问,我们往外看一层 CmakeLists.txt。

3.2 vp/code/CMakelists.txt

# 设置 CMake 最低版本,确保兼容性
cmake_minimum_required(VERSION 3.0)
# 项目名称 设置为 vp_samples
project(vp_samples)
# 定义 编译选项 PLATFORM_AARCH64,默认 开启 (ON),用于 区分 aarch64(ARM 架构)和 x86(PC 端)
option(PLATFORM_AARCH64 "Target platform aarch64" ON)
# 强制使用 C++11 标准 进行编译
set(CMAKE_CXX_STANDARD 11)
# 设置编译模式,变量 CMAKE_BUILD_TYPE 由外部传入,通常可选Debug/Release
SET(CMAKE_BUILD_TYPE ${build_type})
# message(...) 打印当前编译模式
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")# 设置编译 & 预处理选项,几个选项解读见下面
set(CMAKE_CXX_FLAGS "-std=c++11 -Wno-unknown-pragmas -fPIC -O3 -Wl,-unresolved-symbols=ignore-in-shared-libs")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb ")
set(CMAKE_C_FLAGS "-Wno-unknown-pragmas -fPIC -O3")
# 打印编译参数
message("CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
message("CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")# 根据平台 (aarch64 or x86) 设置依赖路径
if(PLATFORM_AARCH64)message(STATUS "build aarch64")# 依赖路径 DEPS_SOURCE_DIR 设为 ...deps_aarch64set(DEPS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../../deps_aarch64)
else()# 添加编译宏 -DUCP_X86add_definitions(-DUCP_X86)message(STATUS "build x86")# 依赖路径 DEPS_SOURCE_DIR 设为 ...deps_x86set(DEPS_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../../deps_x86)
endif()if(PLATFORM_AARCH64)# 设置输出路径set(OUTPUT_ROOT ${PROJECT_SOURCE_DIR}/../vp_samples/script/)set(RELEASE_LIB_DIR ${OUTPUT_ROOT}/aarch64/lib/)set(RELEASE_BIN_DIR ${OUTPUT_ROOT}/aarch64/bin/)# 复制 文件install(DIRECTORY ${DEPS_SOURCE_DIR}/ucp/bin/image DESTINATION ${RELEASE_BIN_DIR})
else()set(OUTPUT_ROOT ${PROJECT_SOURCE_DIR}/../vp_samples/script_x86/)set(RELEASE_LIB_DIR ${OUTPUT_ROOT}/x86/lib/)set(RELEASE_BIN_DIR ${OUTPUT_ROOT}/x86/bin/)# 复制 文件file(COPY ${DEPS_SOURCE_DIR}/ucp/bin DESTINATION ${OUTPUT_ROOT}/x86/)
endif()# 安装文件(通常是库文件、头文件等)到目标目录
install(FILES ${DEPS_SOURCE_DIR}/opencv/lib/libopencv_world.so.3.4 DESTINATION ${RELEASE_LIB_DIR})
# file(GLOB HLOG_LIBS "...") 匹配 libhlog.so* 并安装
file(GLOB HLOG_LIBS "${DEPS_SOURCE_DIR}/hlog/lib/libhlog.so*")
install(FILES ${HLOG_LIBS} DESTINATION ${RELEASE_LIB_DIR})
install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libhbucp.so DESTINATION ${RELEASE_LIB_DIR})
install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libhlog_wrapper.so DESTINATION ${RELEASE_LIB_DIR})
install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libhbvp.so DESTINATION ${RELEASE_LIB_DIR})
install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libhb_arm_rpc.so DESTINATION ${RELEASE_LIB_DIR})
install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libperfetto_sdk.so DESTINATION ${RELEASE_LIB_DIR})
# 额外安装 x86 平台的特殊库
if(NOT PLATFORM_AARCH64)install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libarm_model_gdc.so DESTINATION ${RELEASE_LIB_DIR})install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libhbmem.so.1 DESTINATION ${RELEASE_LIB_DIR})install(FILES ${DEPS_SOURCE_DIR}/ucp/lib/libalog.so.1 DESTINATION ${RELEASE_LIB_DIR})
endif()
# 添加子项目 07_single_rotate
add_subdirectory(07_single_rotate)
  1. PROJECT_SOURCE_DIR 在哪设置的? 答:PROJECT_SOURCE_DIR 是指向项目源代码根目录的 CMake 预定义变量,常用于构建路径、引用资源文件等,帮助 CMake 找到项目中的文件。
  2. build_type 在哪设置的? 答:在 build.sh 脚本中,详情可见文档:【征程 6】工具链 VP 示例为什么能运行。

4. 总结

本文主要介绍在 VP 单算子示例中用到的 CmakeLists.txt 应该怎么写,主要适用于和我一样 C++基础学习用户~

相关文章:

【征程 6】工具链 VP 示例中 Cmakelists 解读

1. 引言 在文章【征程 6】VP 简介与单算子实操中&#xff0c;介绍了 VP 是什么&#xff0c;并以单算子 rotate 为例&#xff0c;介绍了 VP API 使用方法。在【征程 6】工具链 VP 示例中日志打印解读 中介绍了 VP 单算子示例中用到的日志打印的头文件应该怎么写。接下来和大家一…...

制作像素风《饥荒》类游戏的整体蓝图和流程

游戏的制作过程和核心要素拆解成以下几个主要部分&#xff1a; 1. 核心概念与玩法设计 (蓝图构思) 游戏类型: 确定是纯粹的生存、带有冒险元素&#xff0c;还是有其他侧重&#xff1f;&#xff08;比如更强的战斗、建造或剧情&#xff09;核心循环: 玩家主要做什么&#xff1…...

Day22 -php开发01--留言板+知识点(超全局变量 文件包含 数据库操作 第三方插件)

环境要求&#xff1a;php7.0.9 小皮 navicat phpstorm24.1 知识点&#xff1a;会写&#xff08;留言板 留言板后台&#xff09; 超全局变量 三方插件的使用 文件包含 1、开启小皮并利用navicat新建一个数据库 注意&#xff1a;本地的服务mysql关闭后 才可打开小皮。属…...

履带小车+六轴机械臂(1)

基于单片机的可移动抓取机械手 采用的是一个履带底盘和六轴机械臂做的 已经实现的功能有&#xff1a;PS2手柄控制六个轴的舵机转动和控制两个直流减速电机的转动&#xff0c;以此来达到控制移动和抓取的目地&#xff0c;以及用手机APP连接蓝牙模块HC-05也能达到六个轴的舵机转…...

AI:深度学习之循环神经网络(RNN)

🔄 从零入门循环神经网络(RNN):原理详解+代码实战+未来展望 🚀 摘要:在人工智能蓬勃发展的当下,循环神经网络(Recurrent Neural Network, RNN)是处理序列数据的“记忆大师”🧠,正发挥着举足轻重的作用。从自然语言处理中的文本生成、机器翻译,到语音识别、时间…...

03-libVLC的视频播放器:控制(播放/暂停/停止/拖动条/声音)

libvlc_media_player_get_state(m_pMediaPlayer) 功能:获取当前媒体播放器的状态,返回值为libvlc_state_t枚举类型。常见状态值:libvlc_Playing:正在播放libvlc_Paused:已暂停libvlc_Stopped:已停止libvlc_Ended:播放结束libvlc_Error:发生错误注意事项:状态检测是异步…...

Python_仓库使用货拉拉物流运费计算1

仓库地址为广州 物料表里有各SKU的尺寸&#xff0c;长宽高 货拉拉收费明细表 根据订单的SKU的数量、尺寸、重量&#xff0c;去寻找最合适的货拉拉车型&#xff0c;并计算它所需的路费 import pandas as pd# 读取数据 df_111 pd.read_excel(订单明细表.xlsx) df_material …...

CATIA高效工作指南——常规配置篇(一)

一、CATIA无窗口启动优化 原理与实现 通过修改环境变量或启动参数&#xff0c;可禁用启动界面以提升加载速度。添加环境变量CATNOSTARTDOCUMENT1可跳过初始画面 进阶应用&#xff1a; 结合脚本实现静默启动&#xff1a;创建批处理文件&#xff08;.bat&#xff09;包含start …...

【AI提示词】金融信息抽取工程师工作流程

提示说明 专注于从金融行业的文本中提取关键信息&#xff0c;确保准确性和规范性。具备良好的文本处理能力和数据整理经验&#xff0c;能够处理复杂的信息结构。 提示词 # Role&#xff1a;金融信息抽取工程师## Background&#xff1a; 用户希望从金融行业的文本中严格提取…...

8、HTTPD服务--http协议介绍

目录 一、http协议 二、web服务 1、类型 2、cookie、session 三、HTTP协议特性 1、http/0.9 2、http/1.0 3、http/1.1 4、http/2 四、HTTP状态码、请求方法 1、状态码 2、请求方法 一、http协议 应用层协议作用 在客户端、web服务器传递数据 Hyper Text Transfer …...

React useEffect

在发送请求后执行代码 useEffect(副作用函数&#xff0c;依赖项数组) import { useEffect, useState } from "react";const URL http://geek.itheima.net/v1_0/channels function App() {// 创建状态数据const [list,setList] useState([])const [count,setCount] …...

部署Fish-Speech实现声音克隆及文本转语音

FishSpeech 是由Fish Audio团队开发的一款开源文本转语音&#xff08;TTS&#xff09;模型&#xff0c;支持多语言的语音合成和识别。它采用先进的深度学习技术&#xff0c;能够生成自然流畅的语音&#xff0c;并提供高质量的语音转文字功能。FishSpeech 支持声音克隆&#xff…...

Qt之OpenGL中的shader layout

layout一共有两种绑定方法。一种是把设定好的值绑定到shader中、另一种是shader中的layout绑定到代码中。 第一种方法&#xff08;注意&#xff1a;要在link之前绑定同时要把shader代码中的layout设置删掉&#xff09; void sunOpengl::initializeGL() {this->initializeO…...

【问题记录】记录2个安装Centos/Anolis系统卡死在安装包阶段的问题?(硬盘分区?换设备)

背景 问题就不详细记录了&#xff0c;本文记录的是Centos/Anolis安装中卡主的问题。这个问题遇到过几十次了&#xff0c;尝试过各种方法。最近一个偶然因素找到了原因。然后翻看历史上出现这个问题的照片居然是相同的地方卡死。。。 有点意思。特此记录&#xff0c;希望未来遇…...

用纯Qt实现GB28181协议/实时视频/云台控制/预置位/录像回放和下载/事件订阅/语音对讲

一、前言 在技术的长河中探索&#xff0c;有些目标一旦确立&#xff0c;便如同璀璨星辰&#xff0c;指引着我们不断前行。早在2014年&#xff0c;我心中就种下了用纯Qt实现GB28181协议的种子&#xff0c;如今回首&#xff0c;一晃十年已逝&#xff0c;好在整体框架和逻辑终于打…...

论文阅读笔记——Multi-Token Attention

MTA 论文 在 Transformer 中计算注意力权重时&#xff0c;仅依赖单个 Q 和 K 的相似度&#xff0c;无法有效捕捉多标记组合信息。&#xff08;对于 A、B 两个词&#xff0c;单标记注意力需要分别计算两个词的注意力分数&#xff0c;再通过后处理定位共同出现的位置或通过多层隐…...

【VitePress】新增md文件后自动更新侧边栏导航

目录 说在前面先看效果代码结构详细说明侧边栏格式utils监听文件变化使用pm2管理监听进程 说在前面 操作系统&#xff1a;windows11node版本&#xff1a;v18.19.0npm版本&#xff1a;10.2.3vitepress版本&#xff1a;1.6.3完整代码&#xff1a;github 先看效果 模板用的就是官…...

redis大key排查指南

文章目录 一、什么是 Redis 大 Key&#xff1f;二、为什么要排查大 Key&#xff1f;三、如何排查 Redis 大 Key&#xff1f;1、使用 Redis 自带的命令 bigkeys2、使用 SCAN MEMORY USAGE Redis 基本数据数据类型String&#xff08;字符串&#xff09;Hash&#xff08;哈希&…...

Rasa总体目录架构介绍

详细讲解一下每个主要文件/目录的作用&#xff0c;以及之后如何一步步使用它们来训练和运行你的聊天机器人。 &#x1f4c1; Rasa 项目结构说明&#xff08;初始化后生成的主要文件&#xff09; . ├── actions/ │ └── actions.py # 自定义 action 的地方&…...

Python functools模块:函数式编程工具的探索之旅

Python functools模块:函数式编程工具的探索之旅 起源 那是天空线科技公司的一个阴雨绵绵的周二,我首次遇到了一个彻底改变我编程方式的问题。我们团队接到任务,需要优化一个日益复杂且难以维护的关键数据处理流水线。当时的代码库就像一张蜘蛛网,充斥着嵌套函数、重复计…...

吴恩达深度学习复盘(14)迁移学习|项目基本周期

迁移学习 迁移学习是一种机器学习技术&#xff0c;它允许我们将从一个任务中学习到的知识应用到另一个相关的任务中。其核心思想在于&#xff0c;很多情况下&#xff0c;从头开始训练一个模型需要大量的数据和计算资源&#xff0c;而迁移学习能够复用在已有数据上训练好的模型…...

[福游宝——AI智能旅游信息查询平台]全栈AI项目-阶段一:Vite前端开荒

简言 本项目旨在构建一个以AI智能体为核心的福建省旅游信息查询系统&#xff0c;聚焦景点推荐、路线规划、交通天气查询等功能&#xff0c;为游客提供智能化、便捷化的旅游信息服务。项目采用前后端分离架构&#xff0c;前端基于Vite TypeScript Vue3技术栈&#xff0c;搭配…...

SpringCloud-OpenFeign

前言 1.存在问题 远程调用可以像Autowired一样吗 服务之间的通信⽅式,通常有两种:RPC和HTTP. 在SpringCloud中,默认是使⽤HTTP来进⾏微服务的通信,最常⽤的实现形式有两种&#xff1a; RestTemplate OpenFeign RPC&#xff08;RemoteProcedureCall&#xff09;远程过程调⽤&…...

程序化广告行业(79/89):技术革新与行业发展脉络梳理

程序化广告行业&#xff08;79/89&#xff09;&#xff1a;技术革新与行业发展脉络梳理 大家好&#xff01;一直以来&#xff0c;我都热衷于在技术领域不断探索&#xff0c;也深知知识共享对于进步的重要性。写这篇博客&#xff0c;就是希望能和大家一起深入研究程序化广告行业…...

[算法题:快排(一)]颜色分类

1->题目链接 算法题:颜色分类 2->题目解析 数字0表示红色,数字1表示白色,数字2表示蓝色. 这到题说白了就是让我们进行排序,数组中只会有 0 1 2 三种数字 3->算法原理 类⽐数组分两块的算法思想&#xff0c;这⾥是将数组分成三块&#xff0c;那么我们可以再添加⼀个…...

论文精度:YOLOMG:基于视觉的无人机间检测算法——外观与像素级运动融合详解

论文地址:https://arxiv.org/pdf/2503.07115 1. 论文概述 论文标题:YOLOMG: Vision-based Drone-to-Drone Detection with Appearance and Pixel-Level Motion Fusion 作者:Hanqing Guo, Xiuxiu Lin, Shiyu Zhao 发表:未明确会议/期刊(推测为预印本或待发表) 核心贡献:…...

Redis:线程模型

单线程模型 Redis 自诞生以来&#xff0c;一直以高性能著称。很多人好奇&#xff0c;Redis 为什么早期采用单线程模型&#xff0c;它真的比多线程还快吗&#xff1f; 其实&#xff0c;Redis 的“快”并不在于并发线程&#xff0c;而在于其整体架构设计极致简单高效&#xff0c;…...

C++进阶——C++11_{ }初始化_lambda_包装器

目录 1、{ }初始化 1.1 C98的{ } 1.2 C11的{ } 1.3 C11中的std::initializer_list 总结一下&#xff1a; 2、lambda 2.1 lambda的语法 2.2 捕捉列表 2.3 lambda的应用 2.4 lambda的原理 3、包装器 3.1 function 3.2 bind 1、{ }初始化 1.1 C98的{ } C98中一般数组…...

十大PDF解析工具在不同文档类别中的比较研究

PDF解析对于包括文档分类、信息提取和检索在内的多种自然语言处理任务至关重要&#xff0c;尤其是RAG的背景下。尽管存在各种PDF解析工具&#xff0c;但它们在不同文档类型中的有效性仍缺乏充分研究&#xff0c;尤其是超出学术文档范畴。通过使用DocLayNet数据集&#xff0c;比…...

【LeetCode Solutions】LeetCode 160 ~ 165 题解

CONTENTS LeetCode 160. 相交链表&#xff08;简单&#xff09;LeetCode 162. 寻找峰值&#xff08;中等&#xff09;LeetCode 164. 最大间距&#xff08;中等&#xff09;LeetCode 165. 比较版本号&#xff08;中等&#xff09; LeetCode 160. 相交链表&#xff08;简单&#…...

关于 Spring Boot 微服务解决方案的对比,并以 Spring Cloud Alibaba 为例,详细说明其核心组件的使用方式、配置及代码示例

以下是关于 Spring Boot 微服务解决方案的对比&#xff0c;并以 Spring Cloud Alibaba 为例&#xff0c;详细说明其核心组件的使用方式、配置及代码示例&#xff1a; 关于 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案! https://sca.aliyun.com/?spm7145af80…...

3.1多状态专题:LeetCode面试题17.16 按摩师

动态规划解决按摩师预约问题——以LeetCode面试题17.16为例 1.题目链接 LeetCode面试题17.16 按摩师 2.题目描述 一个有名的按摩师收到一系列的预约请求&#xff0c;每个预约都可以选择接受或不接受。但相邻的预约不能同时接受。给定一个包含各预约时长的数组 nums&#xf…...

Netty基础入门(一)

1.EventLoopGroup 1、概念 EventLoopGroup 是一组 EventLoop&#xff0c;Channel 一般会调用 EventLoopGroup 的 register 方法来绑定其中一个 EventLoop&#xff0c;后续这个 Channel 上的 io 事件都由此 EventLoop 来处理&#xff08;保证了 io 事件处理时的线程安全&#x…...

Transformer模型的自注意机制原理、作用、优缺点,通俗易懂

Transformer模型中的自注意力机制&#xff08;Self - attention Mechanism&#xff09;可以通俗地理解为一种让模型自动关注文本中不同部分之间关系的方法。 工作原理 假设你有一句话“我正在吃苹果”&#xff0c;自注意力机制会让模型去分析每个词和其他词之间的关联程度。比…...

设计模式-结构型模式-代理模式

概述 代理模式: Proxy Pattern : 是一种结构型设计模式. 它允许你提供一个替代对象来代表真实对象&#xff0c;以此控制对真实对象的访问。 通过代理对象&#xff0c;可以在不改变目标对象的前提下&#xff0c;扩展其功能或控制对其的访问。 简单理解 &#xff1a; 代理模式就是…...

大模型开发:源码分析 Qwen 2.5-VL 视频抽帧模块(附加FFmpeg 性能对比测试)

目录 qwen 视频理解能力 messages 构建 demo qwen 抽帧代码分析 验证两个实际 case 官网介绍图 性能对比&#xff1a;ffmpeg 抽帧、decord 库抽帧 介绍 联系 对比 测试结果 测试明细 ffmpeg 100 qps 测试&#xff08;CPU&#xff09; decord 100 qps 测试&#x…...

单调栈 —— 1.基本概念与核心算法

1. 基本概念 1.1 知识预备 在理解单调栈之前&#xff0c;我们需要先掌握两个基础概念&#xff1a;栈&#xff08;Stack&#xff09; 和 单调性&#xff08;Monotonicity&#xff09;。 什么是栈&#xff08;Stack&#xff09; 栈是一种**后进先出&#xff08;LIFO, Last-In…...

Ollama部署大模型 (完整版本、网速慢处理、聊天界面)

切记&#xff01;切记&#xff01;切记&#xff01; Ollama软件下载的模型一般都是别人微调好的&#xff0c;且模型文件与HuggingFace等平台不一样&#xff0c;使用为主&#xff0c;没有官方API可以对模型微调&#xff08;教程都是cpp这类的&#xff0c;没必要这么麻烦去操作&a…...

CMake中add_custom_command用法详解

add_custom_command 是 CMake 中用于在构建过程中添加自定义命令的工具。它通常用于生成文件或在构建特定目标前后执行操作。其行为和执行时机取决于具体使用场景。 主要用法 add_custom_command 有两种典型用法&#xff1a; 1. 生成文件&#xff08;Generating Files&#x…...

基于疾风大模型的新能源储能优化系统:方法、实现与案例分析

一、引言 随着可再生能源渗透率不断提高,储能系统在电力系统中的重要性日益凸显。传统储能控制方法主要基于规则策略和简单优化算法,难以应对高比例新能源场景下的复杂决策需求。本文将详细介绍如何利用疾风大模型(Gale Model)构建智能化的新能源储能优化系统,包含核心方…...

Large Language Model(LLM)的训练和微调

之前一个偏工程向的论文中了&#xff0c;但是当时对工程理论其实不算很了解&#xff0c;就来了解一下 工程流程 横轴叫智能追寻 竖轴上下文优化 Prompt不行的情况下加shot(提示)&#xff0c;如果每次都要加提示&#xff0c;就可以试试知识库增强检索来给提示。 如果希望增强…...

Windows 系统中安装 Git 并配置 GitHub 账户

由于电脑重装系统&#xff0c;重新配置了git. 以下是在 Windows 系统中安装 Git 并配置 GitHub 账户的详细步骤&#xff1a; 1. 安装 Git 访问 Git 官网下载页面下载 Windows 版本的 Git 安装程序运行安装程序&#xff0c;使用默认选项即可 2. 配置 Git 用户信息 打开命令…...

KWDB创作者计划—KWDB场景化创新实践:多模态数据融合与边缘智能的突破性应用

引言&#xff1a;AIoT时代的数据库范式重构 在工业物联网设备数量突破千亿、边缘计算节点覆盖率达75%的2025年&#xff0c;传统数据库面临多模态数据处理效率低下、边缘端算力利用率不足、跨域数据协同困难等核心挑战。KWDB&#xff08;KaiwuDB Community Edition&#xff09;通…...

波束形成(BF)从算法仿真到工程源码实现-第四节-最小方差无失真响应波束形成(MVDR)

一、概述 本节我们讨论最 小 方 差 无 失 真 响 应 (Minimum Variance Distortionless Response, MVDR)波束形成算法&#xff0c;包括原理分析及代码实现。 更多资料和代码可以进入https://t.zsxq.com/qgmoN &#xff0c;同时欢迎大家提出宝贵的建议&#xff0c;以共同探讨学习…...

初阶数据结构--链式二叉树

二叉树&#xff08;链式结构&#xff09; 前面的文章首先介绍了树的相关概念&#xff0c;阐述了树的存储结构是分为顺序结构和链式结构。其中顺序结构存储的方式叫做堆&#xff0c;并且对堆这个数据结构进行了模拟实现&#xff0c;并进行了相关拓展&#xff0c;接下来会针对链…...

嵌入式硬件篇---单片机周期

文章目录 前言 前言 在单片机中&#xff0c;时序控制是其执行指令和协调外设的核心基础。以下是单片机中常见的各种周期及其详细说明&#xff0c;以层次结构展开&#xff1a; 时钟周期&#xff08;Clock Cycle&#xff09; 定义&#xff1a; 时钟周期是单片机的最小时间单位&a…...

嵌入式硬件篇---加法减法积分微分器

文章目录 前言 前言 在模拟电子技术中&#xff0c;加法器、减法器、积分器和微分器是基本的运算电路&#xff0c;通常基于运算放大器&#xff08;运放&#xff09;实现。以下是它们的核心原理、典型结构和应用场景&#xff1a; 加法器&#xff08;Summing Amplifier&#xff0…...

解决使用VsCode远程ssh连接虚拟机ubuntu需要重复输入密码

1. windows打开windows powershell并输入如下命令 ssh-keygen -t ed25519 -C 你的随意一个邮箱2. 从路径C:\Users\PC.ssh下找到id_ed25519.pub并打开 复制里面全部内容 3. 切换到ubuntu $ cd .ssh/ $ vi authorized_keys 将前一步复制的内容粘贴进去并保存4. vscode重新连接…...

1558 找素数

1558 找素数 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;质数 &#x1f4d6; &#x1f4da; import java.util.Scanner; import java.util.Arrays;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int a sc.…...

[Android] PDF编辑器 Xodo PDF Reader 9.13.3 (不完全汉化,能用)

[Android] PDF编辑器 Xodo PDF 链接&#xff1a;https://pan.xunlei.com/s/VONeDpxJVwfmeSZu36RvZzSfA1?pwdv67d# 全面的 PDF 查看和批注 支持多种文件格式&#xff0c;包括 PDF 和 Microsoft Office 文档。提供用于添加注释、突出显示文本和为内容添加下划线的工具。包括夜…...