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

CMAKE常用命令详解

NDK

List基本用法

Get–获取列表中指定索引的元素

list(Get list_name index output_var)
解释
  • list_name: 要操作集合的名称
  • index: 要取得的元素下标
  • output_var: 保存从集合中取得元素的结果
栗子
list(GET mylist 0 first_element)  # 获取第一个元素

APPEND–在列表末尾添加元素

list(APPEND list_name element1 element2 ...)
解释
  • list_name: 集合名称
  • element1: 添加集合元素的名称
栗子
list(APPEND mylist "new_item")

INSERT–在指定位置插入元素

list(INSERT list_name index element1 element2 ...)
解释
  • list_name: 集合名称
  • index: 要插入的索引位置
  • element1: 添加集合元素的名称
栗子
list(INSERT mylist 0 "first_item") # 在开头插入

REMOVE_ITEM–移除指定元素

list(REMOVE_ITEM list_name value1 value2 ...)
解释
  • list_name: 集合名称
  • value1: 要移除元素的名称
栗子
list(REMOVE_ITEM mylist "item_to_remove")

LENGTH–获取列表长度

list(LENGTH list_name output_var)
解释
  • list_name: 集合名称
  • output_var: 集合长度
栗子
list(LENGTH mylist list_size)

SORT–列表排序

list(SORT list_name)
解释
  • list_name: 集合名称
栗子
list(SORT mylist) # 按字母顺序排序

string基本用法

REPLACE–替换

string(REPLACE <match_string> <replace_string> <output_variable> <input>)
解释
  • match_string: 要匹配的字符串
  • replace_string: 要替换的字符串
  • output_variable: 存储结果的变量
  • input: 输入的字符串
栗子
string(REPLACE "." ";" VERSION_LIST "1.2.3")  # 结果: "1;2;3"

SUBSTRING–截取

string(SUBSTRING <input> <begin> <length> <output_variable>)
解释
  • input: 输入的字符串

  • begin: 开始截取的起始位置

  • length: 要截取的长度

  • output_variable: 存储结果的变量

栗子
string(SUBSTRING "Hello World" 0 5 RESULT)  # 结果: "Hello"

LENGTH–长度

string(LENGTH <input> <output_variable>)
解释
  • input: 输入的字符串
  • output_variable: 存储结果的变量
栗子
string(LENGTH "Hello" LEN)  # 结果: 5

TOUPPER–转大写

string(TOUPPER <input> <output_variable>)
解释
  • input: 输入的字符串
  • output_variable: 存储结果的变量
栗子
string(TOUPPER "hello" RESULT)  # 结果: "HELLO"

TOLOWER–转小写

string(TOUPPER <input> <output_variable>)
解释
  • input: 输入的字符串
  • output_variable: 存储结果的变量
栗子
string(TOLOWER "HELLO" RESULT)  # 结果: "hello"

FIND–查找

string(FIND <input> <substring> <output_variable>)
解释
  • input: 输入的字符串
  • substring: 查找的字符串
  • output_variable: 存储结果的变量
栗子
string(FIND "Hello World" "World" POSITION)  # 结果: 6

COMPARE–比较

string(COMPARE EQUAL <input1> <input2> <output_variable>)
解释
  • input1: 输入的字符串1
  • input2: 输入的字符串2
  • output_variable: 存储结果的变量
栗子
string(COMPARE EQUAL "hello" "hello" RESULT)  # 结果: TRUE

function–函数基本用法

# 定义函数
function(函数名 [参数1] [参数2] ...)# 函数体
endfunction()# 调用函数
函数名(参数1 参数2 ...)
参数访问

通过参数名字节访问

# 通过参数名直接访问
message("First argument: ${arg1}")
message("Second argument: ${arg2}")

通过ARGV访问所有参数

(argc,argv[])是不是很眼熟,和C语言的访问方式一样

# 通过ARGV访问所有参数
message("All args: ${ARGV}")             # 所有参数的列表
message("Arg count: ${ARGC}")            # 参数个数
message("Arg 0: ${ARGV0}")               # 第一个参数
message("Arg 1: ${ARGV1}")               # 第二个参数
返回值处理
function(my_function result_var)# 使用PARENT_SCOPE设置父作用域变量set(${result_var} "some value" PARENT_SCOPE)
endfunction()# 调用并获取结果
my_function(RESULT)
message("Result: ${RESULT}")

macro–函数的另一版

由于marco和``function的用法非常相似,所以这里与function做一个对比,突出macro`的功能

变量作用域

# Macro示例 - 变量会影响外部作用域
macro(test_macro)set(var "macro value")    # 会改变外部var的值
endmacro()# Function示例 - 变量仅在函数内有效
function(test_function)set(var "function value") # 不会改变外部var的值
endfunction()# 使用示例
set(var "original value")
test_macro()
message("After macro: ${var}")    # 输出: "macro value"set(var "original value")
test_function()
message("After function: ${var}") # 输出: "original value"

参数处理

# Macro中的参数是文本替换
macro(test_macro arg)message("arg = ${arg}")       # 直接使用参数名set(${arg} "new value")       # 可以修改外部变量
endmacro()# Function中的参数是值传递
function(test_function arg)message("arg = ${arg}")       # 使用参数值set(${arg} "new value")       # 需要PARENT_SCOPE才能修改外部变量
endfunction()

返回值处理

# Macro没有真正的返回值机制
macro(test_macro result)set(${result} "macro result")  # 直接修改外部变量
endmacro()# Function需要使用PARENT_SCOPE来返回值
function(test_function result)set(${result} "function result" PARENT_SCOPE)  # 使用PARENT_SCOPE修改父作用域
endfunction()

变量引用

# Macro中的变量引用
macro(test_macro var)message("${${var}}")  # 需要两层${}来获取变量值
endmacro()# Function中的变量引用
function(test_function var)message("${var}")     # 直接使用参数值
endfunction()

特殊变量的行为

# Macro中的ARGN
macro(test_macro arg)message("ARGN = ${ARGN}")  # ARGN包含所有额外参数
endmacro()# Function中的ARGN
function(test_function arg)message("ARGN = ${ARGN}")  # ARGN是一个新的局部变量
endfunction()

递归调用

# Macro的递归可能导致无限展开
macro(recursive_macro count)if(count GREATER 0)math(EXPR new_count "${count} - 1")recursive_macro(${new_count})  # 可能导致问题endif()
endmacro()# Function的递归更安全
function(recursive_function count)if(count GREATER 0)math(EXPR new_count "${count} - 1")recursive_function(${new_count})  # 正常工作endif()
endfunction()

if基本用法

由于if比较简单,所以直接在这里写栗子了

基本比较
# 基础语法
if(条件)# 条件为真时执行
elseif(条件2)# 条件2为真时执行
else()# 所有条件为假时执行
endif()# 常量比较
if(TRUE)  # 也可以用1, ON, YES, Ymessage("True")
endif()if(FALSE) # 也可以用0, OFF, NO, N, IGNORE, NOTFOUND, ""message("False")
endif()
数值比较
# 数值比较运算符
if(1 EQUAL 1)        # 等于
if(1 LESS 2)         # 小于
if(2 GREATER 1)      # 大于
if(1 LESS_EQUAL 1)   # 小于等于
if(1 GREATER_EQUAL 1)# 大于等于# 版本号比较
if(1.2.3 VERSION_LESS 1.2.4)
if(1.2.3 VERSION_GREATER 1.2.2)
if(1.2.3 VERSION_EQUAL 1.2.3)
if(1.2.3 VERSION_LESS_EQUAL 1.2.3)
if(1.2.3 VERSION_GREATER_EQUAL 1.2.3)
字符串比较
# 字符串比较
if("string" STREQUAL "string")  # 字符串相等
if("string" MATCHES "str.*")    # 正则匹配# 字符串比较(不区分大小写)
if("String" STREQUAL "string")          # 为假
if("String" STREQUAL "string" CASE INSENSITIVE) # 为真
路径比较
# 路径比较
if(path1 PATH_EQUAL path2)  # 判断两个路径是否相同# 检查路径是否存在
if(EXISTS "/path/to/file")
if(IS_DIRECTORY "/path/to/dir")
if(IS_SYMLINK "/path/to/symlink")
变量检查
# 变量定义检查
if(DEFINED VARIABLE)         # 检查变量是否被定义
if(NOT DEFINED VARIABLE)     # 检查变量是否未定义# 变量值检查
if(VARIABLE)                # 检查变量值是否为真
if(NOT VARIABLE)            # 检查变量值是否为假# 环境变量检查
if(DEFINED ENV{PATH})       # 检查环境变量是否定义
if($ENV{PATH})             # 检查环境变量的值
逻辑运算
# 与运算
if(condition1 AND condition2)
if(condition1 AND condition2 AND condition3)# 或运算
if(condition1 OR condition2)
if(condition1 OR condition2 OR condition3)# 非运算
if(NOT condition)# 复杂逻辑组合
if((A OR B) AND (C OR D))
文件操作相关
# 文件检查
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/file.txt")
if(IS_NEWER_THAN file1 file2)
if(IS_ABSOLUTE path)# 权限检查
if(IS_DIRECTORY dir AND EXISTS "${dir}/file")
策略和特性检查
# 检查CMake策略
if(POLICY CMP0048)cmake_policy(SET CMP0048 NEW)
endif()# 检查编译器特性
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if(MSVC)
if(APPLE)
if(UNIX)
if(WIN32)
目标库检查
# 检查目标是否存在
if(TARGET target_name)# 检查库是否找到
find_package(OpenGL)
if(OpenGL_FOUND)# 使用OpenGL
endif()

get_property–获取属性值

基本语法

get_property(<variable><GLOBAL | DIRECTORY | TARGET | SOURCE | INSTALL | TEST | CACHE | VARIABLE>PROPERTY <property_name>[DEFINED | SET | BRIEF_DOCS | FULL_DOCS])

解释

  • variable: 用于存储获取到的属性值的变量名
  • 作用域参数(必选其一):
    • GLOBAL - 全局属性
    • DIRECTORY - 目录属性
    • TARGET - 目标属性
    • **SOURCE **- 源文件属性
    • INSTALL - 安装属性
    • **TEST **- 测试属性
    • **CACHE **- 缓存属性
    • VARIABLE - 变量属性
  • PROPERTY <property_name> - 要获取的属性名称

math–数学计算

基本用法

math(EXPR <output_variable> "<expression>")

解释

  • EXPR: 固定格式
  • output_variable: 保存计算后的结果的变量
  • “”: 计算的表达式

栗子

# 多个运算符组合
math(EXPR result "(10 + 5) * 2")  # result = 30# 使用变量
set(a 10)
set(b 20)
math(EXPR result "${a} + ${b}")  # result = 30

message–输出消息日志

基本用法

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

解释

  • mode: 类型
  • “message text”: 输出的消息

栗子

# 状态信息(默认)
message(STATUS "This is a status message")# 错误信息(会终止CMake运行)
message(FATAL_ERROR "This is a fatal error message")# 警告信息(不会终止)
message(WARNING "This is a warning message")# 作者警告
message(AUTHOR_WARNING "This is an author warning message")# 调试信息
message(DEBUG "This is a debug message")# 普通信息(无前缀)
message("This is a normal message")# 发送到stderr的信息
message(SEND_ERROR "This is an error message")# 弃用警告
message(DEPRECATION "This feature is deprecated")

option–布尔类型变量

option命令用于定义布尔类型的选项变量

基本语法

option(<variable> "<help_text>" [value])

参数解释

  • variable: 变量名称
  • “<help_text>”: 帮助文本
  • value: 变量的初始值

栗子

# 构建选项
option(ENABLE_SHARED "Build shared libraries" TRUE)
option(ENABLE_STATIC "Build static libraries" TRUE)

file–文件操作

模板的用法

读取文件

# 读取整个文件到变量
file(READ "filename.txt" file_contents)# 读取文件的前N个字节
file(READ "filename.txt" file_contents LIMIT 1024)# 按行读取文件到列表
file(STRINGS "filename.txt" file_lines)# 读取并去除注释和空行
file(STRINGS "filename.txt" file_lines REGEX "^[^#]")

写入文件

# 写入内容到文件(覆盖)
file(WRITE "output.txt" "Some content")# 追加内容到文件
file(APPEND "output.txt" "More content")# 生成文件
file(GENERATE OUTPUT "config.h" CONTENT "
#define VERSION \"${VERSION}\"
#define BUILD_TYPE \"${CMAKE_BUILD_TYPE}\"
")

文件操作

# 复制文件
file(COPY "source.txt" DESTINATION "dest/")# 复制并重命名
file(COPY_FILE "source.txt" "dest/new.txt")# 删除文件
file(REMOVE "filename.txt")# 删除多个文件
file(REMOVE_RECURSE "dir1" "dir2")# 创建目录
file(MAKE_DIRECTORY "new_dir")

文件查找

# 查找文件
file(GLOB source_files "src/*.cpp")# 递归查找文件
file(GLOB_RECURSE all_sources "src/*.cpp""src/*.h"
)# 相对路径查找
file(GLOB_RECURSE relative_pathsRELATIVE "${CMAKE_CURRENT_SOURCE_DIR}""*.cpp"
)

路径操作

# 获取真实路径
file(REAL_PATH "relative/path" absolute_path)# 获取相对路径
file(RELATIVE_PATH rel_path "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}"
)# 规范化路径
file(TO_CMAKE_PATH "path/with\\mixed/separators" cmake_path)
file(TO_NATIVE_PATH "${cmake_path}" native_path)

文件下载

# 下载文件
file(DOWNLOAD "https://example.com/file.zip""${CMAKE_BINARY_DIR}/file.zip"SHOW_PROGRESS
)# 下载并验证
file(DOWNLOAD "https://example.com/file.zip""${CMAKE_BINARY_DIR}/file.zip"EXPECTED_HASH SHA256=abcdef...TLS_VERIFY ON
)

文件权限

# 设置权限
file(CHMOD "script.sh" PERMISSIONSOWNER_READ OWNER_WRITE OWNER_EXECUTEGROUP_READ GROUP_EXECUTEWORLD_READ WORLD_EXECUTE
)# 获取权限
file(GET_RUNTIME_DEPENDENCIESEXECUTABLES my_exeLIBRARIES my_libDIRECTORIES "${CMAKE_CURRENT_BINARY_DIR}"
)

Configure_file–从模板生成输出文件

基本用法

configure_file(<model_file> <output_file>)

解释

  • model_file: 模板文件
  • output_file: 输出文件

栗子

  1. 变量替换

    # config.h.in 文件内容:
    #define VERSION_MAJOR @VERSION_MAJOR@     // 使用 @变量名@ 语法
    #define VERSION_MINOR @VERSION_MINOR@     // 使用 @变量名@ 语法
    #define PROJECT_NAME "${PROJECT_NAME}"    // 使用 ${变量名} 语法# CMakeLists.txt
    set(VERSION_MAJOR 1)
    set(VERSION_MINOR 0)
    configure_file("config.h.in""${PROJECT_BINARY_DIR}/config.h"
    )# 生成的 config.h 文件内容会是:
    #define VERSION_MAJOR 1
    #define VERSION_MINOR 0
    #define PROJECT_NAME "YourProjectName"
    
  2. 条件替换

    # config.h.in
    #cmakedefine USE_FEATURE      // 条件定义宏
    #cmakedefine01 HAVE_LIBRARY   // 条件定义为0或1# CMakeLists.txt
    option(USE_FEATURE "Enable feature" ON)    # 设置为ON
    set(HAVE_LIBRARY TRUE)                     # 设置为TRUE
    configure_file("config.h.in""${PROJECT_BINARY_DIR}/config.h"
    )# 生成的 config.h 文件内容会是:
    #define USE_FEATURE           // 因为 USE_FEATURE 是 ON
    #define HAVE_LIBRARY 1        // 因为 HAVE_LIBRARY 是 TRUE
    

    add_subdirectory–构建添加子目录

    基本用法

    add_subdirectory(source_dir)
    

    解释

    • source_dir: 子目录中CMakeLists.txt路径

    栗子

    项目结构

    project/
    ├── CMakeLists.txt
    ├── src/
    │ ├── CMakeLists.txt
    │ └── main.cpp
    ├── lib/
    │ ├── CMakeLists.txt
    │ └── library.cpp
    └── tests/
    ├── CMakeLists.txt
    └── test.cpp

CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 添加各个子目录
add_subdirectory(src)
add_subdirectory(lib)
add_subdirectory(tests)

add_library–创建一个库

基本用法

与下面set_target_properties搭配使用

add_library(<name> [STATIC | SHARED] [SOURCE1 | SOURCE2])

解释

  • name: 库的名称
  • [STATIC | SHARED]: 库的类型
  • [SOURCE1 | SOURCE2]: 源文件的地址

栗子

创建普通库

# 1. 创建静态库 (.a / .lib)
add_library(mylib STATIC source1.cpp source2.cpp)# 2. 创建动态库 (.so / .dll)
add_library(mylib SHARED source1.cpp source2.cpp)

导入外部库

# 导入预编译的共享库
add_library(thirdparty SHARED IMPORTED)
set_target_properties(thirdparty PROPERTIESIMPORTED_LOCATION "/path/to/libthirdparty.so"
)

set_target_properties–设置目标文件的属性

基本用法

常用语设置库的相关属性,栗子,参考上方

set_target_properties(target1 target2 ...PROPERTIESprop1 value1prop2 value2 ...)

target_include_directories–添加头文件搜索路径

基本用法

target_include_directories(<target> <INTERFACE|PUBLIC|PRIVATE> [items1...]<INTERFACE|PUBLIC|PRIVATE> [items2...])

解释

  • target: 目标文件
  • <INTERFACE|PUBLIC|PRIVATE>: 权限
  • item: 头文件搜索路径

栗子

PRIVATE

# 只有当前目标能使用这些包含目录
target_include_directories(mylib PRIVATE${CMAKE_CURRENT_SOURCE_DIR}/internal
)

PUBLIC

# 当前目标和链接此目标的其他目标都能使用这些包含目录
target_include_directories(mylib PUBLIC${CMAKE_CURRENT_SOURCE_DIR}/include
)

INTERFACE

# 只有链接此目标的其他目标能使用这些包含目录
target_include_directories(mylib INTERFACE${CMAKE_CURRENT_SOURCE_DIR}/public_api
)

target_link_libraries–链接库

基本用法

target_link_libraries(<target><PRIVATE|PUBLIC|INTERFACE> <item>...[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)

解释

  • target: 链接后的名称
  • <PRIVATE|PUBLIC|INTERFACE>: 权限
  • item: 要链接的包名

相关文章:

CMAKE常用命令详解

NDK List基本用法 Get–获取列表中指定索引的元素 list(Get list_name index output_var)解释 list_name: 要操作集合的名称index: 要取得的元素下标output_var: 保存从集合中取得元素的结果 栗子 list(GET mylist 0 first_element) # 获取第一个元素APPEND–在列表末尾…...

【嵌入式——QT】QT制作安装包

第一步 QT程序写好之后&#xff0c;编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令&#xff0c;回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...

JavaScript 前端开发:从入门到精通的奇幻之旅

目录 一、引言 二、JavaScript 基础 &#xff08;一&#xff09;变量与数据类型 &#xff08;二&#xff09;运算符 &#xff08;三&#xff09;控制结构 三、函数 &#xff08;一&#xff09;函数定义与调用 &#xff08;二&#xff09;函数作用域 &#xff08;三&am…...

shell编程基础笔记

目录 echo改字体颜色和字体背景颜色 bash基本功能&#xff1a; 运行方式&#xff1a;推荐使用第二种方法 变量类型 字符串处理&#xff1a; 条件判断&#xff1a;&#xff08;使用echo $?来判断条件结果&#xff0c;0为true&#xff0c;1为false&#xff09; 条件语句&a…...

FPGA实现GTP光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本博已有的FPGA驱动USB通信方案 3、工程详细设计方案工程设计原理框图输入Sensor之-->OV5640摄像头输入Sensor之-->芯片解码的…...

使用 PDF API 合并 PDF 文件

内容来源&#xff1a; 如何在 Mac 上合并 PDF 文件 1. 注册与认证 您可以注册一个免费的 ComPDFKit API 帐户&#xff0c;该帐户允许您在 30 天内免费无限制地处理 1,000 多个文档。 ComPDFKit API 使用 JSON Web Tokens 方法进行安全身份验证。从控制面板获取您的公钥和密钥&…...

Jenkins Nginx Vue项目自动化部署

目录 一、环境准备 1.1 Jenkins搭建 1.2 NVM和Nodejs安装 1.3 Nginx安装 二、Jenkins配置 2.1 相关插件安装 2.2 全局工具安装 2.3 环境变量配置 2.4 邮箱配置&#xff08;构建后发送邮件&#xff09; 2.5 任务配置 三、Nginx配置 3.1 配置路由转发 四、部署项目 …...

python代码实现问卷星问卷内容获取并写入word文档保存

以下附完整代码。 import os from tkinter import Tk, simpledialog, messagebox from docx import Document import time import requests import re from tkinter import ttk# 使用 tkinter 创建一个简单的输入框来获取用户输入的问卷链接 root Tk() root.title("问卷…...

C# 2024年Visual Studio实用插件集合

在2024年&#xff0c;Visual Studio作为.NET开发者的首选IDE&#xff0c;其插件生态不断壮大&#xff0c;为开发者提供了更高效、便捷的开发体验。本文将介绍一些实用的Visual Studio插件&#xff0c;特别是针对C#开发者&#xff0c;帮助提升开发效率和代码质量。 1. GitHub C…...

基于PHP的香水销售系统的设计与实现

摘 要 时代科技高速发展的背后&#xff0c;也带动了经济的增加&#xff0c;人们对生活质量的要求也不断提高。香水作为一款在人际交往过程中&#xff0c;给对方留下良好地第一印象的产品&#xff0c;在生活中也可以独自享受其为生活带来的点缀。目前香水市场体量庞大&#xff…...

QT去除窗口边框(无边框)

ch21_TencentMeetingLogin::ch21_TencentMeetingLogin(QWidget *parent): QDialog(parent) {ui.setupUi(this);this->setWindowFlags(Qt::FramelessWindowHint);//去除窗口边框 } 但此时窗口不能拖动且点击任务栏程序图标不能最小化&#xff01; this->setWindowFlags(Q…...

【k8s】监控metrics-server

metrics-server介绍 Metrics Server是一个集群范围的资源使用情况的数据聚合器。作为一个应用部署在集群中。Metric server从每个节点上KubeletAPI收集指标&#xff0c;通过Kubernetes聚合器注册在Master APIServer中。为集群提供Node、Pods资源利用率指标。 就像Linux 系统一样…...

「Qt Widget中文示例指南」如何为窗口实现流程布局?(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文将展示如何为不…...

EditInPlace就地编辑:Dom vs Form

利用Dom和Form实现就地编辑&#xff08;EditInPlace&#xff09;功能&#xff0c;两者在实现方式、用户体验和适用场景上有一些区别。下面我将详细解释这些区别&#xff1a; 1. EditInPlace 就地编辑&#xff08;EditInPlace&#xff09;是一种用户界面设计模式&#xff0c;允…...

【SCT63142FIB】15W高集成、高效率的无线功率发射PMIC

SCT63142FIB 15W高集成、高效率的无线功率发射PMIC 描述 SCT63142是一款高度集成的电源管理IC&#xff0c;可实现符合WPC规范的高性能&#xff0c;高效率和成本效益的无线电源发送系统&#xff0c;支持高达15W的功率传输&#xff0c;可与无线应用特定控制器或基于通用MCU的发送…...

STM32F4系列单片机新玩法---Micropython--pyBoard

只需要更改main.py文件的内容即可&#xff0c;例程CRTLV 1、流水灯&#xff1a; # main.py -- put your code here! import pyb while(1): for n in range(1,5) ledpyb.LED(n) led.on() pyb.delay(1000) led.off() 2、灯条,可以改变delay值来凸显效果…...

MFC中如何在工具条动态增加菜单

在C:\temp\VCSamples-master\VC2010Samples\MFC\Visual C 2008 Feature Pack\WordPad 这个例子中倒是有在工具条上动态增加菜单的方法&#xff0c;但有个缺陷&#xff0c;必须预先将需要的按钮定死。现将方法总结如下&#xff1a; 效果如下&#xff1a;点击前&#xff1a; 点击…...

行为型模式-迭代器模式

迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;主要用于提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而不需要暴露其内部表示。这个模式常被用于集合类对象&#xff08;如列表、数组、图等&#xff09;的实现中。 模式结构…...

SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖,Credit/Debit Memo

上一章讲了 请求书&#xff08;发票&#xff09;的取消。 SAP SD学习笔记16 - 请求书的取消 - VF11-CSDN博客 再往上几章&#xff0c;讲了下图里面的返品传票&#xff1a; SAP SD学习笔记14 - 投诉处理1 - 返品处理&#xff08;退货处理&#xff09;的流程以及系统实操&#…...

digit_eye开发记录(3): C语言读取MNIST数据集

在前两篇&#xff0c;我们解读了 MNIST 数据集的 IDX 文件格式&#xff0c;并分别用 C 和 Python 做了 读取 MNIST 数据集的实现。 基于 C 的代码稍长&#xff0c;基于 Python 的代码则明显更短&#xff0c;然而它们的共同特点是&#xff1a;依赖了外部库&#xff1a; 基于 C …...

快速学习GO语言总结

干货分享&#xff0c;感谢您的阅读&#xff01;备注&#xff1a;本博客将自己初步学习GO的总结进行分享&#xff0c;希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力&#xff0c;如有错误请留言指正&#xff0c;谢谢&#xff01; 一、初步了解Go语言 &#xf…...

开源多媒体处理工具ffmpeg是什么?如何安装?使用ffmpeg将M3U8格式转换为MP4

目录 一、FFmpeg是什么二、安装FFmpeg&#xff08;windows&#xff09;三、将M3U8格式转换为MP4格式 一、FFmpeg是什么 FFmpeg是一款非常强大的开源多媒体处理工具&#xff0c;它几乎可以处理所有类型的视频、音频、字幕以及相关的元数据。 FFmpeg的主要用途包括但不限于&…...

Python面试实战:高效处理海量日志,找出高频IP

Python面试实战:高效处理海量日志,找出高频IP 问题描述 在处理海量服务器日志时,一个常见的需求是统计出现次数最多的IP地址。这不仅有助于分析网站访问流量,还能为安全监控提供有价值的信息。然而,当日志文件过大,无法一次性加载到内存时,如何高效地解决这个问题就成…...

基于Java Springboot蛋糕订购小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…...

Java进程为什么会消失

深夜&#xff0c;办公室里只剩下电脑屏幕的微光。小王正在紧张地盯着生产环境的监控面板&#xff0c;突然发现一个重要的Java应用进程不见了&#xff0c;就像人间蒸发一般。这种情况在Java开发中并不罕见&#xff0c;让我们一起走进这个技术探案&#xff0c;揭开Java进程神秘消…...

继上一篇,设置弹框次数以及自适应图片弹框,部分机型(vivo)老手机不显示的问题

上一篇写的本来测试好多型号都无事, 今天下午公司的战斗机vivo横空冒出… 晕 弹框直接显示都出不来了,现在还有用这种老的机型的,但是没办法咯~ 前端遇到这种兼容性的问题就要勇于解决 主要解决了这几点: // 添加图片加载事件 <imgv-if"imageUrl":src"image…...

【docker】容器卷综合讲解,以及go实现的企业案例

容器卷&#xff08;Volumes&#xff09;基础讲解&#xff1a; 容器概念 容器卷&#xff08;Volumes&#xff09;是 Docker 提供的一种持久化存储机制&#xff0c;允许容器持久化数据&#xff0c;即使容器被删除或重新创建&#xff0c;数据仍然可以保留。 卷是独立于容器的&…...

八、利用CSS制作导航栏菜单

8.1 水平顶部导航栏 水平菜单导航栏是网站设计中应用范围最广的导航设计&#xff0c;一般放置在页面的顶部。水平导航适用性强&#xff0c;几乎所有类型的网站都可以使用。 如果导航过于普通&#xff0c;无法容纳复杂的信息结构&#xff0c;就需要在内容模块较多的情况…...

windows下安装node.js和pnpm

首先&#xff0c;一定要powershell右键选择管理员身份运行&#xff0c;否则第三个命令报错。 # 安装 fnm (快速 Node 管理器) winget install Schniz.fnm# 配置 fnm 环境 fnm env --use-on-cd | Out-String | Invoke-Expression# 下载并安装 Node.js fnm use --install-if-mis…...

MyBlog(五) -- 用户注册页面完善

文章目录 前言一、用户数据提交1. 表单2. 校验数据3. 模版文件1. wait_start2. user_register 二、验证1. 发送邮件1. 注册163邮箱后登录并设置2. 开启IMAP/SMTP服务, IMAP/SMTP服务3. 新增授权密码 2.邮箱内容3.点击注册4.发送邮件5. 激活账号1. 完善激活功能 -- user_active2…...

NLP任务四大范式的进阶历程:从传统TF-IDF到Prompt-Tuning(提示词微调)

引言&#xff1a;从TF-IDF到Prompt-Tuning&#xff08;提示词微调&#xff09;&#xff0c;NLP的四次变革 自然语言处理&#xff08;NLP&#xff09;技术从最早的手工特征设计到如今的Prompt-Tuning&#xff0c;经历了四个重要阶段。随着技术的不断发展&#xff0c;我们的目标…...

量化交易系统开发-实时行情自动化交易-8.3.开拓者TBQuant平台

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来会对于开拓者TBQuant平台介绍。 …...

第八课 Unity编辑器创建的资源优化_特效篇(Particle System)详解

无论是CPU还是GPU&#xff0c;粒子系统对其的影响面都是不容小觑的。随着项目的重度化和3A化&#xff0c;玩家的口味变挑剔了、游戏玩法复杂度变高了、画面的特效表现变复杂了......所以我们还是更加谨慎地对待粒子系统。 特效&#xff08;Particle System&#xff09; 游戏效…...

redis常见数据类型

Redis是一个开源的、内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息代理&#xff0c;支持多种数据类型。 一、数据类型介绍 String&#xff08;字符串&#xff09; Redis中最基本的数据类型。可以存储任何类型的数据&#xff0c;包括字符串、数字和二进制…...

【解决安全扫描漏洞】---- 检测到目标站点存在 JavaScript 框架库漏洞

1. 漏洞结果 JavaScript 框架或库是一组能轻松生成跨浏览器兼容的 JavaScript 代码的工具和函数。如果网站使用了存在漏洞的 JavaScript 框架或库&#xff0c;攻击者就可以利用此漏洞来劫持用户浏览器&#xff0c;进行挂马、XSS、Cookie劫持等攻击。 1.1 漏洞扫描截图 1.2 具体…...

深入解析 Kubernetes 节点操作:Cordon、Uncordon 和 Drain 的使用与最佳实践

摘要 Kubernetes 是一个用于自动化容器部署、扩展和管理的开源系统&#xff0c;而节点管理是其核心功能之一。cordon、uncordon 和 drain 是 Kubernetes 提供的与节点操作相关的三个重要命令&#xff0c;用于节点的调度控制和维护管理。本文将从概念、命令解析、内部机制和最佳…...

python array矩阵相关操作

目录&#xff1a; 一、判断某个值是否在array二维数组的某列中 二、根据某列中的特定值筛选array数组 三、查找一个元素在二维 array 矩阵中的位置 四、判断array数组中的每个元素是否包含特定的子字符串 一、判断某个值是否在array二维数组的某列中 在 Python 中&#xf…...

网络安全——浅谈HTTP协议

HTTP请求 HTTP请求是客户端往服务端发送请求动作&#xff0c;告知服务器自己的要求。 HTTP请求由状态行、请求头、请求正文三部分组成&#xff1a; 状态行&#xff1a;包括请求方式Method、资源路径URL、协议版本Version&#xff1b;请求头&#xff1a;包括一些访问的域名、…...

BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比

BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计…...

55 基于单片机的方波频率可调

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 采用STC89C52单片机最小系统&#xff0c;设计DAC0832、放大器、与示波器显示方波&#xff0c;四位数码管显示频率&#xff0c;两个按键可调。 二、硬件资源 基于KEIL5编写C代码&#xff0c;PROT…...

SAP SD学习笔记15 - 投诉处理2 - 返品处理流程之 参照请求传票(发票)来生成返品传票

上一章讲了返品处理&#xff08;退货处理&#xff09;的流程。 SAP SD学习笔记14 - 投诉处理1 - 返品处理&#xff08;退货处理&#xff09;的流程以及系统实操&#xff0c;比如 返品传票&#xff1b;请求Block标记&#xff1b;收到退货之后的处理&#xff0c;请求传票的登录_…...

LWIP和FATFS 实现 FTP 服务端

目录 一、前言 二、LWIP 和 FTP 简介 1.LWIP 2.FTP 三、实现 FTP 服务端的主要步骤 1.初始化 LWIP 2.创建 FTP 服务器任务 3.处理客户端连接 4.实现 FTP 命令处理 5.文件系统操作 6.错误处理和日志记录 四、示例代码 1.创建FTP任务 2. FTP任务代码 3.处理交互数据…...

缓冲区的奥秘:解析数据交错的魔法

目录 一、理解缓存区的好处 &#xff08;一&#xff09;直观性的理解 &#xff08;二&#xff09;缓存区的好处 二、经典案例分析体会 &#xff08;一&#xff09;文件读写流&#xff08;File I/O Buffering&#xff09; BufferedOutputStream 和 BufferedWriter 可以加快…...

【MySQL — 数据库基础】MySQL的安装与配置 & 数据库简单介绍

数据库基础 本节目标 掌握关系型数据库&#xff0c;数据库的作用掌握在Windows和Linux系统下安装MySQL数据库了解客户端工具的基本使用和SQL分类了解MySQL架构和存储引擎 1. 数据库的安装与配置 1.1 确认MYSQL版本 处理无法在 cmd 中使用 mysql 命令的情况&a…...

如何使用Python解析从淘宝API接口获取到的JSON数据?

基本的 JSON 解析 当从淘宝 API 接口获取到数据后&#xff08;假设数据存储在变量response_data中&#xff09;&#xff0c;首先要判断数据类型是否为 JSON。如果是&#xff0c;就可以使用 Python 内置的json模块进行解析。示例代码如下&#xff1a; import json # 假设respon…...

Day1 生信新手笔记

生信新手笔记 生信学习第一天笔记打卡。 转录组学中&#xff1a; 上游分析-基于linux&#xff0c;包括质控、过滤、比对、定量&#xff1b; 下游分析-基于R语言&#xff0c;包括差异分析、富集分析、可视化。 1. 级别标题 一个井号加空格 就是一级标题&#xff0c;两个井号加…...

内网穿透步骤

步骤 第一次需要验证token window和linux的方法不同。 然后 启动 cpolar 服务&#xff1a; 在命令窗口中输入 cpolar.exe htttp 8080&#xff0c;启动内网穿透服务。确保命令窗口保持开启状态&#xff0c;以维持穿透效果。 cpolar.exe hhttp 8080 成功后 注意事项 命令窗口…...

docker启动容器,语句名词解释

#启动容器代码docker run -it -d --name dev_aios -v D:\project\aialign:/www/ -v D:\project\data\dev\aios:/myfile/data/dev/aios -w /www/stand-alone-aios/aios -p 9002:9000 --ulimit core0 aialign/python-base:1.0 bash名词解释 docker run: 这是 Docker 的命令&#…...

微服务之短信验证服务配置完后junit单元测试短信发送失败

总之岁月漫长&#xff0c;然而值得等待。 主要是版本冲突问题&#xff0c;具体报错与解决方法如下&#xff1a; 报错前&#xff1a; 启动失败 短信服务测试报错&#xff1a; 解决后&#xff1a; 启动成功 短信服务测试发送成功&#xff1a; 在使用 SpringBoot 开发时&am…...

QSqlTableModel的使用

实例功能 这边使用一个实例显示数据库 demodb 中 employee 数据表的内容&#xff0c;实现编辑、插入、删除的操作&#xff0c;实现数据的排序和记录过滤&#xff0c;还实现 BLOB 类型字段 Photo 中存储照片的显示、导入等操作&#xff0c;运行界面如下图&#xff1a; 在上图中…...