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

CMake

文章目录

  • 前言
  • 一、快速开始编译C/C++代码
    • 1. 只有源码的项目
    • 2. 包含库的项目
    • 3. 编译成库给他人使用
    • 使用cmake的流程
      • 1. 生成构建系统
      • 2. 执行构建
      • 3. 执行测试
      • 4. 安装 && 打包
  • 二、cmake 语法简介
    • 1 变量
    • 2 条件语句
    • 3 脚本命令
      • **消息打印**
      • **if-else**:
      • **list命令**:
      • **文件操作**
      • **配置文件生成**
      • 执行系统命令
      • 查找库文件
      • include其他模块
  • 三、配置案例
  • 四、配置说明
    • 配置项目
    • 指定编译器语言版本
    • 配置编译选项
    • debug or release
  • 附录
    • 内建变量
  • reference


前言

CMakeake是什么,是用来做什么的,以及如何?
cmake是一个用于管理和构建源代码的工具。
cmake广泛应用于编译C/C++代码,其实也可以用于编译其他语言。
cmake可实现跨平台构建、编译c/c++源码。
cmake除了用于编译外还提供了ctest, cpack用于测试,安装或打包。


第一章适用于新手,在不了解cmake语言的情况下可快速构建自己的项目

一、快速开始编译C/C++代码

1. 只有源码的项目

.
├── include
│   ├── hea2.h
│   └── head1.h
├── main.c
└── src├── fun1.c└── fun2.c

在根目录下新建CMakeLists.txt文件:

# 新项目必须的
cmake_minimum_required(VERSION 3.10)
# 新项目必须的
project(tutorial VERSION 1.0)
# 生成可执行文件必须的
add_executable(mainmain.csrc/fun1.csrc/fun2.c
)
# 指定头文件搜索路径
target_include_directories(main PUBLIC./include
)

接下来,在根目录下新建build目录,然后运行cmake命令

mkdir build && cd build
cmake ..	     # 生成构建系统
cmake --build .  #执行构建

2. 包含库的项目

和1的区别仅为在CMakeLists.txt中把依赖添加进去:

target_link_libraries(mainlibname1libname2
)
target_link_directories(main PUBLIC./lib
)

然后执行cmake 命令即可

3. 编译成库给他人使用

若需要将源文件编译成库而不是可执行文件,则仅需修改CMakeLists.txt文件即可
生成静态库:

add_library(main STATIC  # STATIC可写可不写main.csrc/fun1.csrc/fun2.c
)

生成动态库:

cmake_minimum_required(VERSION 3.10)project(tutorial VERSION 1.0)add_library(main SHAREDmain.csrc/fun1.csrc/fun2.c
)
target_include_directories(main PUBLIC./include
)

使用cmake的流程

  1. 生成构建系统(buildsystem,比如make工具对应的Makefile文件)
  2. 执行构建(比如make),声明目标文件
  3. 执行测试、安装或打包

1. 生成构建系统

通过cmake 命令生成构建系统

参数含义
-S指定源文件根目录,必须包含一个CMakeLists.txt文件
-B指定构建目录,构建生成的中间文件和目标文件的生成路径
-D指定变量,格式为-D =,-D后面的空格可以省略

指定当前目录为源文件目录,其中包含CMakeLists.txt文件,使用build目录作为构建目录
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -DAUTHOR=me

使用-D设置的变量在CMakeLists.txt中生效,可以设置cmake的内置支持的一些变量控制构建的行为;当然也可以使用自定义的变量,在CMakeLists.txt中自行判断做不同的处理。

2. 执行构建

cmake --build .
–buid 后面跟构建系统所在目录

3. 执行测试

如果在CMakeLists.txt中添加如下包含测试的功能则在执行构建后可进行测试

enable_testing()
# include(CTest)  # 添加CTest模块, 可代替enable_testing
add_test(NAME normal_test COMMAND main )
set_tests_properties(normal_test PROPERTIES PASS_REGULAR_EXPRESSION "yes")  # main程序输出“yes”视为通过

4. 安装 && 打包

在CMakeLists.txt中添加如下内容:

install(TARGETS binary_nam DESTINATION ./install/bin)
install(FILES "include/head.h" DESTINATION ./install/inc)
install(EXPORT Json FILE FILE Json.cmake DESTINATION ./install/lib)

然后执行

cmake --install .
或者
cmake --install . --prefix "~/myuser/installdir"

打包部分测试未通过

二、cmake 语法简介

1 变量

CMake中使用setunset命令设置或者取消设置变量

一般变量
设置的变量可以是字符串,数字或者列表(直接设置多个值,或者使用分号隔开的字符串格式为"val1;val2;val3")

# set var
set(val1 a)
set(val2 "hello world")
# set list
set(list1 a b)  # saved as "a;b"
set(list2 a;b)
set(list3 "a;b")set(num 90)  # saved as string, but can compare with other number string
set(falg ON) # bool value
  1. 如果要设置的变量值包含空格,则需要使用双引号或者使用""转义,否则可以省略双引号;
  2. 如果设置多个值或者字符串值的中间有";“,则保存成list,同样是以”;"分割的字符串;
  3. 变量可以被list命令操作,单个值的变量相当于只有一个元素的列表;
  4. 引用变量:${<variable>},在if()条件判断中可以简化为只用变量名<variable>。

Cache变量
Cache变量(缓存条目,cache entries)的作用主要是为了提供用户配置选项,如果用户没有指定,则使用默认值,设置方法如下:

# set(<variable> <value>... CACHE <type> <docstring> [FORCE])
set(CACHE_VAR "Default cache value" CACHE STRING "A sample for cache variable")
  1. 主要为了提供可配置变量,比如编译开关;
  2. 引用CACHE变量:$CACHE{}
  3. Cache变量会被保存在构建目录下的CMakeCache.txt中,缓存起来之后是不变的,除非重新配置更新

环境变量

修改当前处理进程的环境变量,设置和引用格式为:

# set(ENV{<variable>} [<value>])
set(ENV{ENV_VAR} "$ENV{PATH}")
message("Value of ENV_VAR: $ENV{ENV_VAR}")

和CACHE变量类似,要引用环境变量,格式为:$ENV{}。

2 条件语句

  1. 字符串比较,比如:STREQUAL、STRLESS、STRGREATER等;
  2. 数值比较,比如:EQUAL、LESS、GREATER等;
  3. 布尔运算,AND、OR、NOT;
  4. 路径判断,比如:EXISTS、IS_DIRECTORY、IS_ABSOLUTE等;
  5. 版本号判断;
  6. 使用小括号可以组合多个条件语句,比如:(cond1) AND (cond2 OR (cond3))

常量

  1. ON、YES、TRUE、Y和非0值均被视为True;
  2. 0、OFF、NO、FALSE、N、IGNORE、空字符串、NOTFOUND、及以"-NOTFOUND"结尾的字符串均视为False

对于变量,只要其值不是常量中为False的情形,则均视为True。

3 脚本命令

消息打印

message([<mode>] "message text"...)

mode:

  1. 空或者NOTICE:比较重要的信息,如前面演示中的格式
  2. DEBUG:调试信息,主要针对开发者
  3. STATUS:项目使用者可能比较关心的信息,比如提示当前使用的编译器
  4. WARNING:CMake警告,不会打断进程
  5. SEND_ERROR:CMake错误,会继续执行,但是会跳过生成构建系统
  6. FATAL_ERROR:CMake致命错误,会终止进程

if-else:

set(emp_str "")
if (NOT emp_str AND flag and num less 50 and not not_define_var)message(STATUS "first ")
elseif (emp_str)message(STATUS "second")
else()message("third)
endif()

此外还有 for/while等

list命令

  1. APPEND,往列表中添加元素;
  2. LENGTH,获取列表元素个数;
  3. JOIN,将列表元素用指定的分隔符连接起来;
list(APPEND <var> <val>)

文件操作

CMake的file命令支持的操作比较多,可以读写、创建或复制文件和目录、计算文件hash、下载文件、压缩文件等等。

file(GLOB_RECURSE ALL_SRCsrc/module1/*.csrc/module2/*.c)

GLOB_RECURSE表示执行递归查找,查找目录下所有符合指定正则表达式的文件。

配置文件生成

使用configure_file命令可以将配置文件模板中的特定内容替换,生成目标文件。 输入文件中的内容@VAR@或者${VAR}在输出文件中将被对应的变量值替换。 使用方式为:

PROJECT(tutorial VERSION 1.0.1.1)
configure_file(version.h.in "${PROJECT_BINARY_DIR}/version.h")

version.h.in

#define VERSION "@VERSION@"
#define MAJOR @tutorial_VERSION_MAJOR@
#define MINOR @tutorial_VERSION_MINOR@
#define PATCH @tutorial_VERSION_PATCH@

执行系统命令

使用execute_process命令可以执行一条或者顺序执行多条系统命令,对于需要使用系统命令获取一些变量值是有用的。比如获取当前仓库最新提交的commit的commit id:

execute_process(COMMAND bash "-c" "git rev-parse --short HEAD" OUTPUT_VARIABLE COMMIT_ID)

查找库文件

通过find_library在指定的路径和相关默认路径下查找指定名字的库,常用的格式如下:

find_library (<VAR> name1 [path1 path2 ...])

找到的库就可以被其他target使用,表明依赖关系。

include其他模块

include命令将cmake文件或者模块加载并执行

include(CPack) # 开启打包功能
include(CTest) # 开启测试相关功能

CMake自带有很多有用的模块,可以看看官网的链接:cmake-modules,对支持的功能稍微有所了解,后续有需要再细看文档。当然,如果感兴趣,也可以直接看CMake安装路径下的目录CMake\share\cmake-\Modules中的模块源文件。

关于CMake脚本源文件的示例位于路径:cmake/script_demo.cmake,可以使用cmake -P cmake/script_demo.cmake执行查看结果; 关于配置文件生成的操作在项目根目录的CMakeLists.txt中也有示例。

三、配置案例

main CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(tutorial VERSION 2.3)
set(binary_name haha)
add_executable(${binary_name}main.cpp)
message("project_source_dir: ${PROJECT_SOURCE_DIR}, binary: ${PROJECT_BINARY_DIR}")
configure_file(tutorialconfig.h.in tutorialconfig.h)  # comm cmake and src
#########################  change c++ standard  ################################
add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_17)
target_link_libraries(${binary_name} PUBLIC tutorial_compiler_flags)
#-------------------------------------------------------------------------------
add_subdirectory(libs/json)  # subproj CMakeLists.txt
target_link_libraries(${binary_name} PUBLIC Json)
target_include_directories(${binary_name} PUBLIC "${PROJECT_BINARY_DIR}""${PROJECT_SOURCE_DIR}""${PROJECT_SOURCE_DIR}/libs/json""${PROJECT_SOURCE_DIR}/libs/math")
target_link_options(${binary_name} PUBLIC "-D_BUG_")
# cmake . -DUSE_MYLIB=OFF
option(USE_MYLIB "Use providesd imt XXX" ON)
if (USE_MYLIB)target_compile_definitions(${binary_name} PRIVATE "USE_MYLIB")message("oo USE_MYLIB macro used")
else()message("oo USE_MYLIB macro not used")
endif()
#########################  Generator Expression  ###############################
set(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU,LCC>")
set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>")
target_compile_options(tutorial_compiler_flags INTERFACE# "$<${gcc_like_cxx}:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>"# "$<${msvc_cxx}:-W3>"# 仅在构建时启用,在作为项目的模块时不启用"$<${gcc_like_cxx}:$<BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>""$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>"
)
###########################  install & ctest ############################
# cmake --install .
# cmake --install . --prefix "/home/myuser/installdir"
install(TARGETS ${binary_name} DESTINATION ${PROJECT_SOURCE_DIR}/install/bin)
install(FILES "${PROJECT_BINARY_DIR}/tutorialconfig.h" DESTINATION ${PROJECT_SOURCE_DIR}/install/include)
# install(EXPORT Json FILE Json.cmake DESTINATION ${PROJECT_SOURCE_DIR}/install/lib)
enable_testing()  # enable testing
add_test(NAME Runs COMMAND ${binary_name} 25)
add_test(NAME Usage COMMAND ${binary_name} 4)
set_tests_properties(Usage PROPERTIES PASS_REGULAR_EXPRESSION "Usage:.*number")
add_test(NAME StandardUse COMMAND ${binary_name} 4)
set_tests_properties(StandardUse PROPERTIES PASS_REGULAR_EXPRESSION "4 is 2")
function(do_test target arg result)add_test(NAME Comp${arg} COMMAND ${target} ${arg})set_tests_properties(Comp${arg} PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endfunction()
do_test(${binary_name} 4 "4 is 2")
do_test(${binary_name} 5 "5 is 2")
do_test(${binary_name} 6 "6 is 2")
do_test(${binary_name} 7 "7 is 2")
do_test(${binary_name} 8 "8 is 2")
do_test(${binary_name} 9 "9 is 2")
#############################  Dashboard  ######################
include(CTest)  # include CTest module
if(UNIX)message(hello------------)
endif()
##########################  system introspection  ##############################
include(CheckCXXSourceCompiles)  # include this module, check_XXX_compiles
check_cxx_source_compiles("#include <cmath>int main() {std::log(1.0);return 0;}"HAVE_LOG
)
check_cxx_source_compiles("#include <cmath>int main() {std::exp(1.0);return 0;}"HAVE_EXP
)
if (HAVE_LOG AND HAVE_EXP)target_compile_definitions(${binary_name} PRIVATE "HAVE_LOG" "HAVE_EXP")message("support exp and log function")
else()message("not support exp or log function")
endif()
#########################  packaging && installer ? failed  #############################
# This module will include any runtime libraries that are needed by the project for the current platform
include(InstallRequiredSystemLibraries)
# set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set(CPACK_PACKAGE_VERSION_MAJOR "${tutorial_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${tutorial_VERSION_MINOR}")
set(CPACK_SOURCE_GENERATOR "TGZ")
include(CPack)
# then cpack / cpack -G ZIP -C Debug  -G:generator,-C:multi-config specify configuration

sub CMakeLists.txt

include(MakeTable.cmake)  # include and execute
# cmake_minimum_required(VERSION 3.0)
# project(cppjsonrw VERSION 1.9)
add_library(Json json_reader.cc json_value.cc json_writer.cc ${CMAKE_CURRENT_BINARY_DIR}/table.h)
target_include_directories(JsonINTERFACE  # consumers require but the producer doesn't# if not exprot${CMAKE_CURRENT_SOURCE_DIR}  ${CMAKE_CURRENT_BINARY_DIR}# else export# $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}># $<INSTALL_INTERFACE:include>
)
target_link_libraries(Json PUBLIC tutorial_compiler_flags)
message("Jproject source dir: ${PROJECT_SOURCE_DIR}")
message("Jcmake source dir: ${CMAKE_SOURCE_DIR}")
message("Jcmake current source dir: ${CMAKE_CURRENT_SOURCE_DIR}")
#######################  static or dynamic lib  ################################
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}")
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
###########################  install  ############################
set(installable_libs tutorial_compiler_flags Json)
# if (TARGET Json)
#     list(APPEND installable_libs Json)
# endif()
install(TARGETS ${installable_libs} EXPORT Json DESTINATION ${PROJECT_SOURCE_DIR}/install/lib)
install(FILES json.h DESTINATION ${PROJECT_SOURCE_DIR}/install/include)
#######################  custom command and generated file  ####################

四、配置说明

配置项目

# 配置项目
project(tutorial VERSION 1.0.1 LANGUAGES C CXX)

指定编译器语言版本

set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 17)

配置编译选项

通过命令add_compile_options可为所有编译器配置选项(同时对多个编译器生效);通过设置变量CMAKE_C_FLAGS可以配置C编译器选项;设置变量CMAKE_CXX_FLAGS可配置C++编译器的编译选项。

add_compile_options(-Wall -g)
// add_compile_options("-g;-Wall")
set(CMAKE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -std=c99")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -std=c++17")

debug or release

cmake --build . -DCMAKE_BUILD_TYPE=Debug
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -O0")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")

附录

内建变量

PROJECT_SOURCE_DIR最近的CMakeLists.txt中含project命令所在目录
PROJECT_BINARY_DIR最近的含有project的对应构建树中所在目录
CMAKE_SOURCE_DIR顶层CMakeLists.txt所在目录
CMAKE_BINARY_DIR对应构建树顶层目录
CMAKE_CURRENT_SOURCE_DIR当前CMakeLists.txt所在目录
CMAKE_CURRENT_BINARY_DIR对应构建树当前所在目录
<PROJECT-NAME>_VERSION_MAJOR

reference

https://cmake.org/cmake/help/latest/
cmake-commands
cmake-modules(7)-https://cmake.org/cmake/help/latest/manual/cmake-modules.7.html

相关文章:

CMake

文章目录 前言一、快速开始编译C/C代码1. 只有源码的项目2. 包含库的项目3. 编译成库给他人使用使用cmake的流程1. 生成构建系统2. 执行构建3. 执行测试4. 安装 && 打包 二、cmake 语法简介1 变量2 条件语句3 脚本命令**消息打印****if-else**:**list命令**&#xff1a…...

互联网Java工程师面试题·Spring篇·第二弹

目录 3、Beans 3.1、什么是 spring bean&#xff1f; 3.2、spring 提供了哪些配置方式&#xff1f; 3.3、spring 支持集中 bean scope&#xff1f; 3.4、spring bean 容器的生命周期是什么样的&#xff1f; 3.5、什么是 spring 的内部 bean&#xff1f; 3.6、什么是 spri…...

AM@两种余项型泰勒公式的对比和总结@常用函数的麦克劳林公式

文章目录 abstract两种余项型泰勒公式的对比和总结Maclaurin公式常用函数的Maclaurin公式推导例求极限按幂展开 abstract 泰勒公式的两种余项型(Penao&Lagrange)泰勒公式的对比和总结常用的Maclaurin公式列举(Peano余项型为主) 两种余项型泰勒公式的对比和总结 Taylor公式…...

Django实现音乐网站 (22)

使用Python Django框架做一个音乐网站&#xff0c; 本篇音乐播放器功能完善&#xff1a;顺序播放、设置播放数、歌词滚动等功能。 目录 顺序播放 设置顺序播放 单曲播放数 添加路由 视图处理 模板处理 歌词滚动 视图内容返回修改 样式设置 模板内容 歌词滚动脚本 歌…...

pnpm ERR_PNPM_ADDING_TO_ROOT

ERR_PNPM_ADDING_TO_ROOT  Running this command will add the dependency to the workspace root, which might not be what you want - if you really meant it, make it explicit by running this command again with the -w flag (or --workspace-root). If you don’t wa…...

统计学习方法 拉格朗日对偶性

文章目录 统计学习方法 拉格朗日对偶性原始问题对偶问题原始问题和对偶问题的关系 统计学习方法 拉格朗日对偶性 读李航的《统计学习方法》时&#xff0c;关于拉格朗日对偶性的笔记。 在许多统计学习的约束最优化问题中&#xff0c;例如最大熵模型和支持向量机&#xff0c;常…...

.rancher-pipeline.yml

一、注意点 其实下文二的image是基于这个镜像作为基础镜像在这个镜像中执行打包&#xff0c;shellScript 当前路径是你代码块与上图settings.xml&#xff0c;图中的settings.xml可以替换下你当前镜像的settings.xml 示例 二、.rancher-pipeline.yml ${CICD_GIT_BRANCH}这些从官…...

RK3588平台开发系列讲解(显示篇)MIPI DSI协议介绍之分层

🚀返回专栏总目录 文章目录 一、MIPI DSI 分层1.1、应用层1.2、协议层1.3、链路层1.4、物理层沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 DSI 全称是 Display Serial Interface,是主控和显示模组之间的串行连接接口。 MIPI DSI 接口分为数据线和时钟线,均为…...

前端学成在线项目详细解析三

19-推荐课程-内容样式 HTML结构 <ul><li><a href"#"><div class"pic"><img src"./uploads/course01.png" alt""></div><div class"text"><h4>JavaScript数据看板项目实战…...

使用Kali进行实验---主机发现

主机发现 【实训目的】 掌握主机扫描的工作原理&#xff0c;学会使用ping等扫描工具&#xff0c;发现网络当中活跃的主机。 【场景描述】 在虚拟机环境下配置4个虚拟系统“Win XP1” “Win XP2” “Kali Linux”和“Metasploitable2”&#xff0c;使得4个系统之间能够相互通…...

美团笔试真题2023第一场(4题)

点评&#xff1a; 题目总体来说偏向于中下难度 1.字符串前缀 题目描述&#xff1a; 现在有两个字符串S和T&#xff0c;你需要对S进行若干次操作&#xff0c;使得S是T的一个前缀&#xff08;空串也是一个前缀&#xff09;。每次操作可以修改S的一个字符&#xff0c;或者删除一个…...

PHP explode (多)分隔符(delimiters) 使用

PHP explode (多)分隔符(delimiters) 使用 问题&#xff1a;[https://blog.csdn.net/YBaog?typeblog] 把链接中所有的字符串取出。 ㊙️ 神秘算法 ㊙️ function multi_explode($delimiters, $string) {$data [];if ($string) {$str str_replace($delimiters, $delimiter…...

AI的Prompt是什么

一.AI的Prompt的作用 在人工智能&#xff08;AI&#xff09;中&#xff0c;"Prompt"通常指的是向AI系统提供的输入或指令&#xff0c;用于引导AI进行特定的操作或生成特定的输出。例如&#xff0c;在一个对话型AI系统中&#xff0c;用户输入的问题就是一个prompt&…...

Qt之自定义model读写CSV文件

一.效果 本文基于QAbstractTableModel实现了一个支持读写CSV文件的TableModel。CSV数据格式虽然很简单,但是网上大多数读写方式其实都是有bug的,没考虑到字段里包含逗号或换行符这种复杂数据的情况。 二.原理 CSV(Comma-Separated Values)文件是一种简单类型的纯文本文件…...

golang 工程组件:grpc-gateway 环境安装+默认网关测试

grpc-gateway grpc-gateway 顾名思义是专门是grpc的网关。也是一个protobuf的编译器&#xff0c;是一个proto的插件。 grpc-gateway就是将http请求处理后转发到对应grpc服务上。很多浏览器&#xff0c;或者客户端开箱不支持grpc&#xff0c;只支持传统的restful API。 grpc网关…...

IP地址SSL证书 IP证书

在许多企业用例中&#xff0c;公司需要SSL证书作为IP地址。公司使用IP地址通过Internet访问各种类型的应用程序。 公网IP地址的SSL证书&#xff1a; 内部IP&#xff08;也称为私有IP&#xff09;是IANA设置为保存的IPv4或IPv6地址&#xff0c;例如&#xff1a; RFC 1918范围内…...

MVCC 过程中会加锁吗?

MVCC 机制&#xff0c;全称&#xff08;Multi-Version Concurrency Control&#xff09;多版本并发控制&#xff0c;是确保 在高并发下&#xff0c; 多个事务读取数据时不加锁也可以多次读取相同的值。 MVCC 在读已提交&#xff08;READ COMMITTED&#xff09;、可重复读&…...

NLP入门——语言结构/语言建模

一、Linguistics 语言学 wordsmorphology 形态学&#xff1a;词的构成和内部结构研究。如英语的dog、dogs和dog-catcher有相当的关系morpheme 语素&#xff1a;最小的语法单位&#xff0c;是最小的音义结合体lexeme 词位&#xff1a;词的意义的基本抽象单位&#xff0c;是一组…...

2023java攻克了抖音视频去水印视频下载

2023java攻克了抖音视频去水印视频下载 1、过滤链接 /*** 过滤链接&#xff0c;获取http连接地址* param url* return*/public static String decodeHttpUrl(String url) {int start url.indexOf("http");int end url.lastIndexOf("/");String decodeu…...

云计算要学习哪些技术?

学习云计算需要涉及多个技术领域和相关的工具、平台和框架。以下是一个详细的介绍&#xff0c;帮助您了解学习云计算所需的技术。 1. 虚拟化技术 虚拟化是云计算的基础&#xff0c;因此了解虚拟化技术至关重要。学习虚拟化技术时&#xff0c;需要掌握以下知识点&#xff1a; …...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...