鸿蒙进阶——CMakelist、GN语法简介及三方库通用移植指南
文章大纲
- 引言
- 一、GN常用的内置变量
- 二、GN常用的内置函数
- 三、CMake 重要语法
- 1、生成动态库
- 2、生成静态库
- 3、生成OBJECT 库
- 4、重要的函数和模块
- 4.1、add_definitions
- 4.2、execute_process
- 4.3、add_dependencies
- 4.4、install
- 4.5、FetchContent
- 四、GN 重要语法
- 1、编译Target
- 2、预构建Target
- 3、group
- 4、external_deps 和 deps
- 五、编写bundle.json 配置模块信息
- 1、inner_kits声明对外开放的动态库(可选)
- 2、使用inner_kits
引言
BUILD.gn 是 Google 开发的一种构建脚本语言,用于描述项目依赖关系、编译规则等信息,以便由 ninja 构建系统生成构建文件并进行编译。华为基于gn进行了一些扩展并把其作为主要的构建系统,换句话说无论是完全全采用gn来构建还是通过gn间接触发cmake等其他构建系统也好,OpenHarmony中都是要先改成gn的,移植主要有以下步骤:
- GN 方式进行构建
- 编写bundle.json 配置Module及其部件信息
- 注册Module 到指定的subsystem
一、GN常用的内置变量
名称 | 描述 |
---|---|
current_cpu | 当前工具链的处理器架构 |
current_os | 当前工具链的操作系统类型 |
current_toolchain | 表示当前使用的工具链 |
default_toolchain | 表示默认使用的工具链 |
target_cpu | 表示目标平台的CPU类型 |
target_os | 表示目标平台的操作系统类型 |
root_build_dir | 表示根目录的构建目录 |
root_gen_dir | 表示根目录的生成目录 |
root_out_dir | 表示根目录的输出目录 |
target_out_dir | 表示目标文件的输出目录 |
target_gen_dir | 表示中间文件的生成目录 |
defines | 表示当前目标的预定义宏列表 |
include_dirs | 表示当前目标的头文件搜索路径列表 |
cflags | 表示当前目标的C语言编译选项列表 |
cxxflags | 表示当前目标的C++语言编译选项列表 |
ldflags | 表示当前目标的链接选项列表 |
asmflags | 表示当前目标的汇编语言编译选项列表 |
libs | 表示当前目标依赖的库文件列表 |
二、GN常用的内置函数
名称 | 描述 |
---|---|
assert() | 断言函数,如果条件不成立,则会抛出一个异常 |
defined() | 判断变量是否已经定义 |
exec_script() | 执行一个Python脚本 |
get_label_info() | 获取标签信息,例如标签的名称、路径、类型等等 |
get_path_info() | 获取路径信息,例如路径是否存在、是否是目录、是否是文件等等 |
group() | 将一组目标文件组合成一个库文件 |
import() | 导入其他GN构建文件 |
read_file() | 读取文件内容 |
read_json() | 读取JSON格式的文件 |
read_path() | 读取路径中的内容,返回一个字符串列表 |
rebase_path() | 重新定位路径,将路径中的某个部分替换为新的值 |
write_file() | 写入文件内容 |
template() | 处理字符串模板,将模板中的变量替换为实际的值,其功能类似与函数 |
action() | 定义一个自定义的构建动作,通过action调用python脚本完成期望动作 |
action_foreach() | 针对每个元素执行一个自定义的构建动作 |
executable() | 定义一个可执行文件 |
shared_library() | 定义一个动态库 |
static_library() | 定义一个静态库 |
三、CMake 重要语法
在 CMake 中,add_library 命令用于创建库目标,可以是静态库(Static Library)、动态库(Shared Library)或目标对象(Object Library)。
1、生成动态库
- 使用
add_library(${target_name} SHARED ${ARGN})
创建动态库,它会生成一个共享对象文件,如libexample.so
。 - 动态库在运行时被可执行文件加载,而不是在链接时复制到可执行文件中。
- 静态库和动态库可以直接被可执行文件或其他库目标链接
- 动态库是一个共享对象文件,用于在运行时共享,适用于当你想要运行时共享代码,节省内存占用,或在不重启应用程序的情况下更新功能。
- 动态库需要在编译对象文件后进行额外的生成共享对象。
function(onnxruntime_add_shared_library target_name)
add_library(${target_name} SHARED A R G N ) o n n x r u n t i m e c o n f i g u r e t a r g e t ( {ARGN}) onnxruntime_configure_target( ARGN)onnxruntimeconfiguretarget({target_name})
endfunction()
2、生成静态库
- 使用
add_library(${target_name} STATIC ${ARGN})
创建静态库,它会将对象文件存档成一个单一的文件,如libexample.a
。 - 静态库在链接时会被复制到最终的可执行文件中。
- 静态库和动态库可以直接被可执行文件或其他库目标链接。
- 静态库是一个存档文件,包含所有成员对象文件,适用于当你想要分发包含所有依赖的单一文件,便于部署。
- 静态库需要在编译对象文件后进行额外的存档步骤
function(onnxruntime_add_static_library target_name)
add_library(${target_name} STATIC A R G N ) o n n x r u n t i m e c o n f i g u r e t a r g e t ( {ARGN}) onnxruntime_configure_target( ARGN)onnxruntimeconfiguretarget({target_name})
endfunction()
3、生成OBJECT 库
- 使用
add_library(${target_name} OBJECT ${ARGN})
创建的是目标对象库,它是一个包含编译后对象文件的集合。 - 这些对象文件不会自动被存档成库文件(
.a
或.so
),而是可以直接被其他库或可执行文件目标链接。 - 对象库不能直接被链接,它的对象文件需要被其他库或可执行文件显式链接。
- 对象库实际上是不存档的,它只是一组编译后的对象文件,适用于当你想要在多个目标之间共享编译结果,避免重复编译相同的代码。
- 对象库不涉及额外的编译步骤来创建库文件。
创建目标对象库的示例
add_library(${target_name} OBJECT ${ARGN})
${target_name}
是库目标的名称,${ARGN}
是传递给 add_library
命令的所有额外参数,通常是源文件列表。这样创建的对象库可以被其他目标通过 target_sources
命令添加到它们的源文件列表中。
依赖头文件和库
include_directories(${ONNXRUNTIME_INCLUDE_DIR}${REPO_ROOT}/include/onnxruntime/core/session
)
4、重要的函数和模块
4.1、add_definitions
add_definitions 函数用于向项目中添加编译器定义。这些定义会被转换为预处理器宏,可以在源代码中使用 #ifdef、#ifndef、#define 等预处理器指令来控制条件编译。比如说add_definitions(-DOPENVINO_CONFIG_NPU=1) 相当于是-DOPENVINO_CONFIG_NPU=1在编译过程中,对于所有的源文件,都定义一个名为 OPENVINO_CONFIG_NPU 的宏,并将其值设置为 1。在 C++ 源代码中,你可以使用 #ifdef OPENVINO_CONFIG_NPU 或 #if defined(OPENVINO_CONFIG_NPU) 来检查这个宏是否被定义。
#ifdef OPENVINO_CONFIG_NPU// 这部分代码只有在 OPENVINO_CONFIG_NPU 宏被定义时才会被编译// 实现与 NPU 相关的功能
#endif
4.2、execute_process
用于执行一个外部进程,并可以捕获其输出。它允许 CMake 脚本与系统上的其他命令行工具交互。
execute_process(COMMAND <cmd> [args1 [args2 ...]][WORKING_DIRECTORY <dir>][TIMEOUT <seconds>][RESULT_VARIABLE <variable>][OUTPUT_VARIABLE <variable>][ERROR_VARIABLE <variable>][OUTPUT_STRIP_TRAILING_WHITESPACE][ERROR_STRIP_TRAILING_WHITESPACE][ENCODING <encoding>][ECHO [STDOUT|STDERR]][RESULT_ERROR_VARIABLE <variable>][OUTPUT_FILE <file>][ERROR_FILE <file>][USE_RESULT_VARIABLE][RESULT_CODE <variable>][OUTPUT_QUIET][ERROR_QUIET][COMMAND_ERROR_IS_FATAL]
)
execute_process 执行了 ls -l 命令,并将输出和错误分别存储在 output 和 error 变量中。然后使用 message 函数打印输出结果。
# 执行一个命令并捕获输出
execute_process(COMMAND ls -lOUTPUT_VARIABLE outputERROR_VARIABLE errorOUTPUT_STRIP_TRAILING_WHITESPACE
)
# 打印输出结果
message(STATUS "Command Output:\n${output}")
if(error)message(STATUS "Command Error:\n${error}")
endif()
4.3、add_dependencies
是 CMake 中的一个指令,用于定义目标(通常是可执行程序或库)之间的依赖关系。当你使用 add_dependencies 命令时,你告诉 CMake 在构建某个目标之前需要先构建其他的目标。
add_dependencies(onnxruntime_flatbuffers flatc)
onnxruntime_flatbuffers 这个目标在构建之前需要先构建 flatc 目标。如果你还没有定义 onnxruntime_flatbuffers 和 flatc,你需要先定义它们:
add_executable(flatc src/flatc.cpp)
# 假设 onnxruntime_flatbuffers 依赖于由 flatc 生成的源代码
add_library(onnxruntime_flatbuffers STATICsrc/onnxruntime_generated.cpp# 其他源文件
)
# 设置 onnxruntime_flatbuffers 对 flatc 的依赖
add_dependencies(onnxruntime_flatbuffers flatc)
4.4、install
用于指定在安装目标(可执行文件、库、头文件等)时应采取的操作。这个函数定义了如何将构建的文件和目录复制到系统的标准安装位置,或者用户指定的任何位置。
- ${CMAKE_INSTALL_LIBDIR} 共享库、静态库或者库相关的其他文件的标准目录。
- ${CMAKE_INSTALL_BINDIR} 可执行文件的标准目录。
除了可以通过CMake脚本配置还可以在命令行配置 -DCMAKE_INSTALL_LIBDIR=some/path 或 -DCMAKE_INSTALL_BINDIR=some/path 来指定自定义的安装路径。 - 安装可执行文件到默认的 bin 目录
install(TARGETS my_executable RUNTIME DESTINATION bin) - 安装库文件到默认的 lib 目录
install(TARGETS my_library LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) - 安装头文件到特定目录
install(FILES my_header.h DESTINATION include) - 安装数据文件到特定目录
install(FILES my_header.h DESTINATION include) - 设置文件权限
install(FILES my_file.txt DESTINATION /etc/my_project PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
4.5、FetchContent
include(FetchContent) 是一个命令,用于包含 FetchContent 模块。FetchContent 是 CMake 的一个内置模块,它提供了一种机制来下载、缓存和包含外部项目或依赖项,这些项目或依赖项可以是源代码仓库或二进制文件。使用 FetchContent 模块,你可以将第三方库或项目作为依赖项集成到你的 CMake 项目中,而无需手动下载和集成这些依赖项。这个模块会自动处理依赖项的下载和配置
- 自动下载:如果指定的依赖项不在缓存中,FetchContent 会自动从指定的 URL 下载依赖项。
- 缓存机制:下载的依赖项会被缓存,以避免未来的重新下载,提高构建效率。
- 可配置性:你可以配置下载的源代码的子模块、分支、标签或提交,以确保获取正确的依赖项版本。
- 依赖项包含:下载的依赖项可以作为子目录包含在项目中,或者作为独立的外部项目使用。
- 兼容性:FetchContent 模块兼容 CMake 3.11 及以上版本。
使用步骤 - include(FetchContent)
- FetchContent_Declare(子模块名) 获取项目。
- FetchContent_MakeAvailable(子模块),再引入我们的项目中
- target_link_libraries(主项目 PRIVATE 子模块::子模块)
四、GN 重要语法
GN 是以target 为基础对象构建组织的,所以CMake中的动态库、静态库在GN中映射为对应的Target,而华为为每一种Target定义了一套对应的模板,直接按照相应语法配置即可。
/build/templates/cxx/cxx.gni
GN中通用的规则
- .gn 文件所在的目录是构建根目录。
- 路径以“//” 开头的表示绝对路径,以“/“或者则表示相对路径
//path/to/proprietary_library:libproprietary 冒号前部分是库所在的目录绝对路径,冒号后部分是该库在 BUILD.gn 文件中定义的Target名称 - gn中不支持以通配符的形式把相应的源文件打包起来,gn中的源文件需要逐条列出,头文件可以只配置对应目录
- declare_args 定义变量,这个变量疑似是全局唯一的所有在同一个系统内部名称不能重复
declare_args() {allow_sanitize_debug = false
}
1、编译Target
-
ohos_shared_library 编译动态库
-
ohos_static_library编译静态库
-
ohos_executable 编译可以执行文件
ohos_source_set配置源集
2、预构建Target
/build/templates/cxx/prebuilt.gni
所谓prebuilt 从某种程度上来说就是把现有的产物复制到对应的路径下,复制过程中根据需要进行相关的依赖关系处理。
- ohos_prebuilt_executable 不额外配置路径的话会保存到${install_images}/bin目录下
- ohos_prebuilt_shared_library 不额外配置路径的话会保存到${install_images}/lib 或者lib64目录下
- ohos_prebuilt_static_library 不额外配置路径的话会保存到${install_images}/lib 或者lib64目录下
- ohos_prebuilt_etc 不额外配置路径的话会保存到${install_images}/etc目录下
ohos_prebuilt_etc(“mnist.onnx”) {
source = “//third_party/onnxrt/test/demo/mnist.onnx”
subsystem_name = “third_party”
part_name = “onnx_runtime”
install_images = [ chipset_base_dir ] #会保存到 vendor/etc下
install_enable = true
}
3、group
group作用就是把所有的Target 的编译入口整合到一个group Target里,在bundle.json里就不需要逐条去声明了,只需要声明一个group就会触发。
group("onnx_runtime") {deps = [":onnxrt_providers_shared",":onnxrt_1.18.0",":onnxrt_link",]if(enable_demo){deps += [ ":onnxrt_demo",":mnist.onnx",]}
}
4、external_deps 和 deps
external_deps 节点用于指定项目所依赖的外部(非本Module内部)库或模块。而deps 属性用于指定一个构建目标(如 executable、shared_library、static_library 等)所依赖的其他目标。这些依赖可以是同一项目内的其他构建目标,也可以是通过 external_deps 声明的外部库。
在添加一个模块的时候,需要在BUILD.gn中声明它的依赖,部件内依赖deps和部件间依赖external_deps。
- 部件内依赖: 现有模块module1属于部件part1,要添加一个属于部件part1的模块module2,module2依赖于module1,这种情况就属于部件内依赖。
import(“//build/ohos.gni”)
ohos_shared_library("module1") {……part_name = "part1" # 必选,所属部件名称……
}import("//build/ohos.gni")
ohos_shared_library("module2") {……deps = ["module1的gn target",……] # 部件内模块依赖
part_name = "part1" # 必选,所属部件名称
}
- 部件间依赖: 现有模块module1属于部件part1,要添加一个模块module2,module2依赖于module1,module2属于部件part2。模块module2与模块module1分属于两个不同的部件,这种情况就属于部件间依赖。
import("//build/ohos.gni")
ohos_shared_library("module1") {……part_name = "part1" # 必选,所属部件名称……
}import("//build/ohos.gni")
ohos_shared_library("module2") {……external_deps = ["part1:module1",……] # 部件间模块依赖,这里依赖的模块必须是依赖的部件声明在inner_kits中的模块part_name = "part2" # 必选,所属部件名称
}
五、编写bundle.json 配置模块信息
OpenHarmony中以模块Module 进行组织,其配置文件为bundle.json。
{#HPM部件英文名称,格式"@组织/部件名称""name": "@ohos/alsa-lib",# 部件功能一句话描述"description": "The alsa-lib is a library to interface with ALSA in the Linux kernel and virtual devices using a plugin system.",# 版本号,版本号与OpenHarmony版本号一致"version": "3.1",# 部件License"license": "GNU Lesser General Public License v2.1",# HPM包的发布方式,当前默认都为code-segment"publishAs": "code-segment",# 发布类型为code-segment时为必填项,定义发布类型code-segment的代码还原路径(源码路径)"segment": {"destPath": "third_party/alsa-lib"},# HPM包的目录结构,字段必填内容可以留空"dirs": {},# HPM包定义需要执行的脚本,字段必填,值非必填"scripts": {},# 部件License路径,字段和值非必填"licensePath": "COPYING",# 部件说明路径,字段和值非必填"readmePath": {"en": "README.md","zh": "README_zh.md"},# 部件属性"component": {# 部件名称"name": "alsa-lib",# 部件所属子系统,字段必填,值非必填"subsystem": "thirdparty",# 部件为应用提供的系统能力,在component下加入关键字syscap,对内部配置相应的系统能力。系统能力若无赋值,则默认为true,若有赋值,则按实际值为准。若值为true,则表示该部件默认开启此系统能力,若值为false,则表明该部件默认关闭此系统能力。WIFI的STA、AP、和HotspotExt三个系统能力是打开的,而P2P和Core是关闭的。"syscap": ["SystemCapability.Communication.WiFi.STA = true","SystemCapability.Communication.WiFi.AP = true","SystemCapability.Communication.WiFi.P2P = false","SystemCapability.Communication.WiFi.Core = false","SystemCapability.Communication.WiFi.HotspotExt"],# 部件对外的可配置特性列表,一般与build中的sub_component对应,可供产品配置"features": [],# 轻量(mini)小型(small)和标准(standard),可以是多个比如:["standard", "small"],"adapted_system_type": [ "standard" ],# 部件ROM值"rom": "950KB",# 部件RAM估值"ram": "988KB","deps": {"components": [], # 部件依赖的其他部件"third_party": [] # 部件依赖的其他部件},# 编译相关配置"build": {# 部件编译入口,模块在此处配置组件产物的so、静态库的BUILD.gn,可执行文件不能在这里配置"sub_component": [ "//third_party/alsa-lib:libasound" ],# 对外开放的模块在此处配置"inner_kits": [],# 部件测试用例编译入口"test": []}}
}
1、inner_kits声明对外开放的动态库(可选)
似乎目前OpenHarmony只支持以so的形式对外提供,也就是external_deps 部分中所依赖到的外部库,本质上都是其他模块对外提供的bundle.json中的inner_kits部分的。
2、使用inner_kits
这样子声明之后就可以在external_deps里像 c_utils:c_utils这样直接形如”模块名:inner_kits “即 onnx_runtime:onnxrt_1.18.0
- 使用这个inner_kits模块的bundle.json 下的 “component” 下的"deps"里"components"中配置上inner_kits所在Component的name
根据具体情况再不同的子节点中配置即可,有些可能需要配置在third_party下的。
- 在使用这个inner_kits模块的BUILD.gn下配置需要引入的inner_kits的头文件和库Target
相关文章:
鸿蒙进阶——CMakelist、GN语法简介及三方库通用移植指南
文章大纲 引言一、GN常用的内置变量二、GN常用的内置函数三、CMake 重要语法1、生成动态库2、生成静态库3、生成OBJECT 库4、重要的函数和模块4.1、add_definitions4.2、execute_process4.3、add_dependencies4.4、install4.5、FetchContent 四、GN 重要语法1、编译Target2、预…...
场景化应用实战系列六:检索问答系统
目录 景化应用实战系列六:检索问答系统 一、目标设定 二、关键知识点梳理 三、案例讲解与实战操作 1. 数据准备与预处理 2. 倒排表构建 3. 文本相似度计算 4. 检索问答系统实现 5. 系统优化与改进 一、目标设定 构建一个高效的检索问答系统,能…...
3452. 好数字之和
题目来源: LeetCode题目:3452. 好数字之和 - 力扣(LeetCode) 解题思路: 按要求判断求和即可。 解题代码: #python3 class Solution:def sumOfGoodNumbers(self, nums: List[int], k: int) -> int:r…...
GEE数据下载问题记录
GEE下载数据时的一些记录 1. GPT说 2. 验证 在未指定投影坐标系的情况下,下载原始数据导出的是MODIS Sinusoidal投影,如果单纯的对波段值进行操作,不会进行投影转换,如果涉及到波段平均,则会转投影到WGS84坐标系。如…...
P1833 樱花
P1833 樱花 - 洛谷 题目背景 《爱与愁的故事第四弹plant》第一章。 题目的描述 爱与愁大神后院里种了n棵樱花树,每棵都有美学值Ci(0≤Ci≤200)。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸,他懂得如何欣赏樱花:一种樱…...
文件操作和IO-3 文件内容的读写
文件内容的读写——数据流 流是操作系统提供的概念,Java对操作系统的流进行了封装。 数据流就像水流,生生不息,绵延不断。 水流的特点:比如要100mL的水,可以一次接10mL,分10次接完,也可以一次接…...
Day 0015:Metasploit 基础解析
目录 一、理论学习(Metasploit 架构与核心组件) 一、架构设计:分层与模块化 基础层(Ruby 框架): 核心层(模块引擎): 接口层(交互界面)&#…...
相机标定与图像处理涉及的核心坐标系
坐标系相互关系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…...
单例模式的运用
单例模式实现分析 在我们的向量数据库配置类 MilvusVectorDatabaseConfig 中,采用了单例模式的实现方式,这是一种非常经典且实用的设计模式。 饿汉式单例实现 这种实现方式属于饿汉式单例模式,它的优点在于: // 在类加载时就创…...
PageHelper分页原理解析:从源码到MySQL方言实现
一、引言 分页查询是Web开发的必备功能,MyBatis生态中的PageHelper以其简单易用的特性广受欢迎。本文将从源码层面(v5.3.2)解析PageHelper的分页实现机制,结合MySQL方言展示完整的执行链路。 二、核心实现原理 1. 插件初始化 …...
MySQL中索引最左前缀法则、索引失效情况、前缀索引、索引设计原则
最左前缀法则 联合索引中,最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列,如果跳跃某一列,索引将会部分失效(后面的字段索引失效)举例假设有一个联合索引包含三个字段按顺序:…...
pdf图片导出(Visio和Origin)
一、Visio 导入pdf格式图片 1. 设计->大小,适应绘图。 2. 文件->导出,导出为pdf格式。 上面两部即可得到只包含图的部分的pdf格式。 如果出现的有默认白边,可以通过以下方式设置: 1. 文件->选项->自定义功能区->…...
NR 通讯的整体架构
前言: 并假设发射器发送了一个信号,如左下角所示(蓝色),接收器检测到的信号显示在右侧(红色)。您在图中注意到的第一件事是什么?那就是发送的信号和接收的信号并不完全相同。 有什么…...
【大模型面试每日一题】Day 26:从伦理角度,大模型可能存在哪些潜在风险?技术上如何实现内容安全控制(如RLHF、红队测试)?
【大模型面试每日一题】Day 26:从伦理角度,大模型可能存在哪些潜在风险?技术上如何实现内容安全控制(如RLHF、红队测试)? 📌 题目重现 🌟🌟 面试官:从伦理角度…...
第六届电子通讯与人工智能国际学术会议(ICECAI 2025)
在数字化浪潮中,电子通讯与人工智能的融合正悄然重塑世界的运行逻辑。技术基础的共生关系是这场变革的核心——电子通讯如同“信息高速公路”,通过5G等高速传输技术,将海量数据实时输送至AI系统,使其能够像人类神经系统般快速响应…...
深入剖析 5G 核心网中的 PLMN
一、引言 在 5G 技术迅猛发展的当下,5G 核心网作为整个通信系统的关键枢纽,支撑着海量数据传输、低延迟通信以及多样化业务应用。其中,公共陆地移动网络(Public Land Mobile Network,PLMN)扮演着极为重要的角色,它是 5G 核心网实现用户接入、网络管理以及业务提供的基础…...
佰力博科技与您探讨半导体电阻测试常用的一些方法
一、两探针法 两探针法是一种较为基础的测试方法。该方法将两根探针与半导体样品表面紧密接触,通过电源在两根探针之间施加电压,同时使用电流表测量通过样品的电流,再根据欧姆定律计算电阻。这种方法的优点在于操作简单、设备要求较低&a…...
5G 核心网中的 NPN 功能详解
引言 在 5G 技术飞速发展的今天,5G 核心网不断演进,为各类应用场景提供强大支撑。其中,NPN(Non-Public Network,非公共网络)功能作为 5G 核心网的重要特性,正逐渐崭露头角,在众多行业中发挥着关键作用。它为特定用户或组织打造专属网络环境,满足其对网络性能、安全性…...
谷歌medgemma-27b-text-it医疗大模型论文速读:多语言大型语言模型医学问答基准测试MedExpQA
《MedExpQA: 多语言大型语言模型医学问答基准测试》论文解析 一、引言 论文开篇指出大型语言模型(LLMs)在医学领域的巨大潜力,尤其是在医学问答(QA)方面。尽管LLMs在医学执照考试等场景中取得了令人瞩目的成绩&#…...
# 深入解析BERT自然语言处理框架:原理、结构与应用
深入解析BERT自然语言处理框架:原理、结构与应用 在自然语言处理(NLP)领域,BERT(Bidirectional Encoder Representations from Transformers)框架的出现无疑是一个重要的里程碑。它凭借其强大的语言表示能…...
js中encodeURIComponent函数使用场景
encodeURIComponent 是 JavaScript 中的一个内置函数,它的作用是: 将字符串编码为可以安全放入 URL 的形式。 ✅ 为什么需要它? URL 中有一些字符是有特殊意义的,比如: ? 用来开始查询参数 & 分隔多个参数 连接…...
【NLP 77、Python环境管理工具之conda】
如果你第一万次否定自己,那我希望我可以一万零一次大声称赞你 —— 25.5.22 一、什么是conda conda是一个开源的包管理系统和环境管理系统,主要用于Python语言,但也可以用于其它语言的项目 二、为什么要使用conda ① 多环境共存,多…...
替代云数据库的本地方案:MySQL+phpMyAdmin的远程管理与跨网络访问技术
文章目录 前言1. 安装MySQL2. 安装phpMyAdmin3. 修改User表4. 本地测试连接MySQL5. 安装cpolar内网穿透6. 配置MySQL公网访问地址7. 配置MySQL固定公网地址8. 配置phpMyAdmin公网地址9. 配置phpmyadmin固定公网地址 前言 对于运维来说,平时还好,一旦出门…...
Dify大语言模型应用开发环境搭建:打造个性化本地LLM应用开发工作台
文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 各位小伙伴们,大家好!今天我们要来一场技术大冒险,手把手教你如何在Linux Ubuntu系统上使用Docke…...
MySQL索引事务
索引 通过索引可以对查询操作进行优化,通过减少全表扫描,快速定位数据,原本的查询操作是对表进行遍历,如果是大表效率较低 1)注意事项 占用了更多的空间,由于生成索引需要依赖于数据结构和额外数据&…...
Seay代码审计工具
Seay代码审计工具 介绍 Seay代码审计工具是一款由国内安全研究人员"Seay"开发的源代码安全审计工具,主要用于帮助安全人员快速发现PHP代码中的安全漏洞,快速定位代码中的安全风险点。 主要功能特点 自动化审计功能 支持自动扫描PHP代码中的…...
【人工智障生成日记1】从零开始训练本地小语言模型
🎯 从零开始训练本地小语言模型:MiniGPT TinyStories(4090Ti) 🧭 项目背景 本项目旨在以学习为目的,从头构建一个完整的本地语言模型训练管线。目标是: ✅ 不依赖外部云计算✅ 完全本地运行…...
技术分享:大数据挖掘平台架构设计与行业应用实践
在数字化转型浪潮下,企业数据规模呈指数级增长。如何构建高效的数据挖掘体系,实现数据价值变现,成为技术团队面临的重要课题。本文将深入探讨大数据挖掘平台的核心架构、关键技术及行业应用实践。 一、平台架构设计 1. 数据采集层 支持多源异…...
线性Wi-Fi FEM被卷死,非线性FEM是未来?
在跑了一圈路由器客户之后,我的内心反而平静下来,被卷死的不只是Wi-Fi FEM赛道,还有家用路由器市场。 尽管路由器市场比较惨淡,不过客户还是很愿意接见我,并做更广泛的交流和探讨。一方面之前推Wi-Fi FEM的众多厂商在渐…...
OpenCV CUDA模块图像过滤------用于创建一个最小值盒式滤波器(Minimum Box Filter)函数createBoxMinFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数创建的是一个 最小值滤波器(Minimum Filter),它对图像中每个像素邻域内的像素值取最小值。常用于&…...
【MySQL】06.MySQL表的增删查改
1. insert 我们先创建一个表结构,这部分操作我们使用这张表完成我们的操作: mysql> create table student(-> id int primary key auto_increment,-> name varchar(20) not null,-> qq varchar(20) unique-> ); Query OK, 0 rows affec…...
MySQL 索引失效及其解决办法
一、前言 在数据库优化中,索引(Index)是一项至关重要的技术手段,可以显著提升查询性能。然而,在实际开发过程中,MySQL 索引并不总是如预期生效。本文将从原理出发,系统地介绍索引失效的常见场景及其解决方案,帮助开发者有效规避性能陷阱。 二、索引基础回顾 MySQL 支…...
在线时间戳(Unix TimeStamp)转换器
做了一个在线时间戳转换器,简单、好用,提供多种日期格式。 移动端友好。 目标是做一套在线工具集,时间戳转换只是第一步。 欢迎试用...
flutter 项目调试、flutter run --debug调试模式 devtools界面说明
Flutter DevTools 网页界面说明 1. 顶部导航栏 Inspector:查看和调试 Widget 树,实时定位 UI 问题。Performance-- 性能分析面板,查看帧率、CPU 和 GPU 使用情况,识别卡顿和性能瓶颈。Memory-- 内存使用和对象分配分析ÿ…...
Qt C++实现马的遍历问题
在这个项目中,我们面对的是一个基于中国象棋的马的遍历问题,使用了C++编程语言,并结合了Qt5库来实现图形界面和棋盘的绘制。以下是这个项目涉及的关键知识点: 马的移动规则:马在象棋中具有独特的“日”字形移动方式,即每次可以向前、后、左或右移动一格,然后在同一行或同…...
web第六次课后作业--使用ApiFox实现请求响应操作
一、实体参数 1.1 简单实体参数 1.2 复杂实体对象 如果请求参数比较多,通过上述的方式一个参数一个参数的接收会比较繁琐。此时,我们可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装,需要遵守如下规则:请求参数名…...
第十周作业
一、CSRF 1、DVWA-High等级 2、使用Burp生成CSRF利用POC并实现攻击 二、SSRF:file_get_content实验,要求获取ssrf.php的源码 三、RCE 1、 ThinkPHP 2、 Weblogic 3、Shiro...
Excel合并单元格后,如何自动批量生成序号列
1.选择整列 2.组合键:CtrlG 3.定位条件,选择“空值” 4.在第一个框中输入“MAX(”,鼠标选中A1框,后加“:”,鼠标选中前方“A1”,按“F4”绝对引用,补全右括号,后输入“1…...
数据结构 -- B树和B+树
B树 B树 5叉查找树 最少1个关键字,2个分叉 最多4个关键字,5个分叉 如何保证查找效率 (1)eg.对于5叉排序树,规定除了根节点外,任意结点都至少有3个分叉,2个关键字 (若每个结点内关…...
el-table高度自适应、数据查询后高度展示错误问题
在很多场景中我们需要实现表格的高度自适应,即不同屏幕大小下需要使用不同的高度来设置表格,那么我们应该如何实现呢? 1.el-table实现高度自适应 通过以下代码可以实现表格根据屏幕进行自适应 设置表格的高度 <el-table ref"tableD…...
unittest
1.什么是unittest? unittest是Python自带的一个单元测试框架, 它可以做单元测试, 也能用于编写和运行重复的测试工作。它给自动化测试用例开发和执行提供了丰富的断言方法, 判断测试用例是否通过, 并最终生成测试结果. 2.unittest组成 2.1 TestCase TestCase即测试…...
【Linux学习笔记】ext2文件系统的深度剖析
【Linux学习笔记】ext2文件系统的深度剖析 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 文章目录 【Linux学习笔记】ext2文件系统的深度剖析前言一.ext2文件系统1.1宏观认识 二. Block Group三. 块组内部构成3.1 超级块&am…...
Vue 3 官方 Hooks 的用法与实现原理
Vue 3 引入了 Composition API,使得生命周期钩子(hooks)在函数式风格中更清晰地表达。本篇文章将从官方 hooks 的使用、实现原理以及自定义 hooks 的结构化思路出发,全面理解 Vue 3 的 hooks 系统。 📘 1. Vue 3 官方生…...
通过现代数学语言重构《道德经》核心概念体系,形成一个兼具形式化与启发性的理论框架
以下是对《道德经》的数学转述尝试,通过现代数学语言重构其核心概念,形成一个兼具形式化与启发性的理论框架: 0. 基础公理体系 定义: 《道德经》是一个动态宇宙模型 U(D,V,Φ),其中: D 为“道”的无限维…...
openai-whisper-asr-webservice接入dify
openai-whisper-asr-webservice提供的asr的api其实并不兼容openai的api,所以在dify中是不能直接添加到语音转文字的模型中,对比了下两个api的传参情况,其实只要改动一处,就能支持: openai兼容的asr调用中formdata中音频…...
曾经在知乎上看到一个回答:“入职做FPGA,后续是否还可以转数字IC设计?”
曾经在知乎上看到一个回答:“入职做FPGA,后续是否还可以转数字IC设计?” 对比FPGA的行业薪资水平,数字IC行业中的一些基础性岗位薪资比FPGA要高一些。 除了薪资之外,更多FPGA开发者考虑转向数字IC设计的原因如下&…...
第4周_作业题_逐步构建你的深度神经网络
文章目录 ***逐步构建你的深度神经网络***0. 背景0.1 要解决的问题0.2 作业大纲0.3 构建深层神经网络步骤 1. 导入包2. 初始化参数2.1 2层神经网络2.2 L层神经网络 3. 前项传播函数3.1 前项传播步骤3.2 线性前向3.3 线性激活部分3.4 L层前项传播模型3.5 计算成本 4. 反向传播模…...
Linux 搭建FTP服务器(vsftpd)
搭建FTP服务器(vsftpd): 文章目录 搭建FTP服务器(vsftpd):配置镜像安装vsftpd配置vsftpd关闭SELinux:配置防火墙启动vsfptd服务并设置开机自启创建FTP用户测试windows中测试Linux测试下载get/mget上传put/mput删除文件delete 搭建SCP服务器(基…...
AWS中国区中API Gateway中403的AccessDeniedException问题
问题 在互联网使用API Gateway的域名访问接口,出现403问题AccessDeniedException。具体如下: 前提 这里API Gateway相关配置都没有问题。而且,vpc内网都能访问被代理的服务。这里api gateway不需要使用自定义域名。 解决 向客服发个工单…...
计量单片机 RN8302:特性、使用与应用
在现代电力监测与能源管理领域,精确的电能计量至关重要。计量单片机 RN8302 作为一款高性能的电能计量芯片,凭借其卓越的特性与功能,在众多应用场景中发挥着关键作用。本文将全面深入地介绍 RN8302 的各项特性、使用方法、注意事项以及广泛的…...