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的流程
- 生成构建系统(buildsystem,比如make工具对应的Makefile文件)
- 执行构建(比如make),声明目标文件
- 执行测试、安装或打包
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中使用set和unset命令设置或者取消设置变量
一般变量
设置的变量可以是字符串,数字或者列表(直接设置多个值,或者使用分号隔开的字符串格式为"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
- 如果要设置的变量值包含空格,则需要使用双引号或者使用""转义,否则可以省略双引号;
- 如果设置多个值或者字符串值的中间有";“,则保存成list,同样是以”;"分割的字符串;
- 变量可以被list命令操作,单个值的变量相当于只有一个元素的列表;
- 引用变量:${<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")
- 主要为了提供可配置变量,比如编译开关;
- 引用CACHE变量:$CACHE{}
- Cache变量会被保存在构建目录下的CMakeCache.txt中,缓存起来之后是不变的,除非重新配置更新
环境变量
修改当前处理进程的环境变量,设置和引用格式为:
# set(ENV{<variable>} [<value>])
set(ENV{ENV_VAR} "$ENV{PATH}")
message("Value of ENV_VAR: $ENV{ENV_VAR}")
和CACHE变量类似,要引用环境变量,格式为:$ENV{}。
2 条件语句
- 字符串比较,比如:STREQUAL、STRLESS、STRGREATER等;
- 数值比较,比如:EQUAL、LESS、GREATER等;
- 布尔运算,AND、OR、NOT;
- 路径判断,比如:EXISTS、IS_DIRECTORY、IS_ABSOLUTE等;
- 版本号判断;
- 使用小括号可以组合多个条件语句,比如:(cond1) AND (cond2 OR (cond3))
常量:
- ON、YES、TRUE、Y和非0值均被视为True;
- 0、OFF、NO、FALSE、N、IGNORE、空字符串、NOTFOUND、及以"-NOTFOUND"结尾的字符串均视为False
对于变量,只要其值不是常量中为False的情形,则均视为True。
3 脚本命令
消息打印
message([<mode>] "message text"...)
mode:
- 空或者NOTICE:比较重要的信息,如前面演示中的格式
- DEBUG:调试信息,主要针对开发者
- STATUS:项目使用者可能比较关心的信息,比如提示当前使用的编译器
- WARNING:CMake警告,不会打断进程
- SEND_ERROR:CMake错误,会继续执行,但是会跳过生成构建系统
- 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命令:
- APPEND,往列表中添加元素;
- LENGTH,获取列表元素个数;
- 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命令**:…...
互联网Java工程师面试题·Spring篇·第二弹
目录 3、Beans 3.1、什么是 spring bean? 3.2、spring 提供了哪些配置方式? 3.3、spring 支持集中 bean scope? 3.4、spring bean 容器的生命周期是什么样的? 3.5、什么是 spring 的内部 bean? 3.6、什么是 spri…...
AM@两种余项型泰勒公式的对比和总结@常用函数的麦克劳林公式
文章目录 abstract两种余项型泰勒公式的对比和总结Maclaurin公式常用函数的Maclaurin公式推导例求极限按幂展开 abstract 泰勒公式的两种余项型(Penao&Lagrange)泰勒公式的对比和总结常用的Maclaurin公式列举(Peano余项型为主) 两种余项型泰勒公式的对比和总结 Taylor公式…...
Django实现音乐网站 (22)
使用Python Django框架做一个音乐网站, 本篇音乐播放器功能完善:顺序播放、设置播放数、歌词滚动等功能。 目录 顺序播放 设置顺序播放 单曲播放数 添加路由 视图处理 模板处理 歌词滚动 视图内容返回修改 样式设置 模板内容 歌词滚动脚本 歌…...
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…...
统计学习方法 拉格朗日对偶性
文章目录 统计学习方法 拉格朗日对偶性原始问题对偶问题原始问题和对偶问题的关系 统计学习方法 拉格朗日对偶性 读李航的《统计学习方法》时,关于拉格朗日对偶性的笔记。 在许多统计学习的约束最优化问题中,例如最大熵模型和支持向量机,常…...
.rancher-pipeline.yml
一、注意点 其实下文二的image是基于这个镜像作为基础镜像在这个镜像中执行打包,shellScript 当前路径是你代码块与上图settings.xml,图中的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进行实验---主机发现
主机发现 【实训目的】 掌握主机扫描的工作原理,学会使用ping等扫描工具,发现网络当中活跃的主机。 【场景描述】 在虚拟机环境下配置4个虚拟系统“Win XP1” “Win XP2” “Kali Linux”和“Metasploitable2”,使得4个系统之间能够相互通…...
美团笔试真题2023第一场(4题)
点评: 题目总体来说偏向于中下难度 1.字符串前缀 题目描述: 现在有两个字符串S和T,你需要对S进行若干次操作,使得S是T的一个前缀(空串也是一个前缀)。每次操作可以修改S的一个字符,或者删除一个…...
PHP explode (多)分隔符(delimiters) 使用
PHP explode (多)分隔符(delimiters) 使用 问题:[https://blog.csdn.net/YBaog?typeblog] 把链接中所有的字符串取出。 ㊙️ 神秘算法 ㊙️ function multi_explode($delimiters, $string) {$data [];if ($string) {$str str_replace($delimiters, $delimiter…...
AI的Prompt是什么
一.AI的Prompt的作用 在人工智能(AI)中,"Prompt"通常指的是向AI系统提供的输入或指令,用于引导AI进行特定的操作或生成特定的输出。例如,在一个对话型AI系统中,用户输入的问题就是一个prompt&…...
Qt之自定义model读写CSV文件
一.效果 本文基于QAbstractTableModel实现了一个支持读写CSV文件的TableModel。CSV数据格式虽然很简单,但是网上大多数读写方式其实都是有bug的,没考虑到字段里包含逗号或换行符这种复杂数据的情况。 二.原理 CSV(Comma-Separated Values)文件是一种简单类型的纯文本文件…...
golang 工程组件:grpc-gateway 环境安装+默认网关测试
grpc-gateway grpc-gateway 顾名思义是专门是grpc的网关。也是一个protobuf的编译器,是一个proto的插件。 grpc-gateway就是将http请求处理后转发到对应grpc服务上。很多浏览器,或者客户端开箱不支持grpc,只支持传统的restful API。 grpc网关…...
IP地址SSL证书 IP证书
在许多企业用例中,公司需要SSL证书作为IP地址。公司使用IP地址通过Internet访问各种类型的应用程序。 公网IP地址的SSL证书: 内部IP(也称为私有IP)是IANA设置为保存的IPv4或IPv6地址,例如: RFC 1918范围内…...
MVCC 过程中会加锁吗?
MVCC 机制,全称(Multi-Version Concurrency Control)多版本并发控制,是确保 在高并发下, 多个事务读取数据时不加锁也可以多次读取相同的值。 MVCC 在读已提交(READ COMMITTED)、可重复读&…...
NLP入门——语言结构/语言建模
一、Linguistics 语言学 wordsmorphology 形态学:词的构成和内部结构研究。如英语的dog、dogs和dog-catcher有相当的关系morpheme 语素:最小的语法单位,是最小的音义结合体lexeme 词位:词的意义的基本抽象单位,是一组…...
2023java攻克了抖音视频去水印视频下载
2023java攻克了抖音视频去水印视频下载 1、过滤链接 /*** 过滤链接,获取http连接地址* param url* return*/public static String decodeHttpUrl(String url) {int start url.indexOf("http");int end url.lastIndexOf("/");String decodeu…...
云计算要学习哪些技术?
学习云计算需要涉及多个技术领域和相关的工具、平台和框架。以下是一个详细的介绍,帮助您了解学习云计算所需的技术。 1. 虚拟化技术 虚拟化是云计算的基础,因此了解虚拟化技术至关重要。学习虚拟化技术时,需要掌握以下知识点: …...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
