2. CMake 语法的基本指令

news2024/12/23 14:47:58

2. CMake 语法的基本指令

主要介绍 CMake 脚本语言的一些基础语法怎么使用, 这个行为就像学习 C/C++编程语言一样, 从变量, 字符串, 列表这些基础的数据类型, 然后一步步延伸到 if/else, for 等这类的基本逻辑函数,了解 CMake 脚本的基本语法.

CMake 官网对指令的划分

我希望带大家一起了解的内容如下图所示,从这些基本的指令使用方法开始,了解 CMake 这个工具,也为了方便进行 CMake 的其他知识学习!

在这里插入图片描述

2.1 最小 CMakeLists.txt 文件包含的内容

  1. 举个例子之前的最小的 CMake 工程就只包括两个内容main.c和它的头文件hex.h, 以及一个math.h的动态库libm.so, 整个的文件结构如下所示:
.
├── hex.h
└── main.c
  1. 此时的最小构建的 CMakeLists.txt 文件就包括这些内容:
cmake_minimum_required(VERSION 3.0)
project(TEST)

add_executable(test main.c hex.h)
target_link_libraries(test m)
  1. 依次解读这几个指令:
  • cmake_minimum_required(最小版本号): 指定了 CMake 的最低版本要求;

  • project(项目名): 定义了项目的名称;

  • add_executable(可执行程序名 源文件名称): 这行命令用于添加一个可执行文件的构建目标; add_executable(test main.c hex.h)在这个例子中, 它会编译名为"test"的可执行文件, 并将 main.chex.h 作为源代码文件, CMake 会自动根据这些源文件来生成构建规则;

  • target_link_libraries(可执行程序名 动态库名称): 这行命令用于指定构建目标的链接库; target_link_libraries(test m)表示"test"可执行文件需要链接动态数学库m(libm.so);

动态库的名称均是形如libxxx.solib开头, .so结尾, 其中的xxx便是动态库的名称了.

  1. CMakeLists.txt每一行的顺序排列是有一定规则的:cmake_minimum_required 通常是在 CMakeLists.txt 文件的开头, 用于指定 CMake 最低版本要求, 这样做可以确保构建系统在运行时具有所需的 CMake 版本; project 命令通常紧跟在 cmake_minimum_required 之后, 用于定义项目的名称和相关属性, 这样做可以在后续的构建规则中使用项目的属性; add_executable 命令用于添加构建目标, 并定义源代码文件, 它通常紧跟在 project 命令之后, 以便在项目中创建可执行文; target_link_libraries 命令用于指定链接库, 它位于构建目标指令add_executable之后, 以确保在构建可执行文件之前已经定义了所需的链接库.

2.2 CMake 的预定义宏和输出命令

为了方便了解 CMakeLists.txt 中,一些变量的结果,因此我们先提前介绍一下 CMake 中的宏和它的输出指令的用法

2.2.1 CMake 的输出 message 指令

  1. message指令:用于在构建过程中输出自定义的消息或变量的值, 语法如下:message([<mode>] "message_text" ...),其中,mode 是可选参数,指定消息的类型, message_text是要输出的消息文本,可以包含变量、表达式和字符串.(在 CMake 指南中 []间的内容都是可选内容)

  2. 常用的 mode 有以下几种:

  • STATUS:将消息输出为构建过程中的状态信息,通常用于显示一些进度或提示信息.
  • WARNING:将消息输出为警告信息,通常用于显示一些警告或注意事项.
  • AUTHOR_WARNING:将消息输出为作者警告信息,通常用于显示一些重要的警告信息.
  • SEND_ERROR:将消息输出为错误信息,并终止构建过程.
  • FATAL_ERROR:将消息输出为致命错误信息,并终止构建过程.
  1. message指令示例:
message("Hello, CMake!") # 输出普通消息

set(variable "world")
message("Hello, ${variable}!") # 输出包含变量的消息

message(STATUS "This is a status message") # 输出状态信息

message(WARNING "This is a warning") # 输出警告信息

message(FATAL_ERROR "This is a fatal error") # 输出致命错误并终止构建过程

在这里插入图片描述

2.2.2 CMake 的预定义宏

  1. CMake 预定义的宏是在 CMake 构建系统中预先定义的一些宏变量, 它们提供了有关构建环境和选项的信息, 用于指定源代码文件、目标输出路径、编译选项等, 预定义宏变量在 CMake 中是只读的,不能修改其值.

  2. 常用的 CMake 预定义宏:

  • CMAKE_SOURCE_DIR:表示CMakeLists.txt所在的顶级源代码目录的路径.

  • CMAKE_BINARY_DIR:表示当前构建目录(编译目录)的路径.

  • CMAKE_CURRENT_SOURCE_DIR:表示当前处理的CMakeLists.txt所在的源代码目录的路径.

  • CMAKE_CURRENT_BINARY_DIR:表示当前处理的CMakeLists.txt所在的构建目录的路径.

  • CMAKE_CURRENT_LIST_DIR:表示当前处理的CMakeLists.txt文件所在的完整路径.

  • CMAKE_MODULE_PATH:表示用于查找 CMake 模块文件的路径,可以将自定义的模块文件放置在该路径下.

  • CMAKE_C_COMPILERCMAKE_CXX_COMPILER:表示用于编译 C 和 C++代码的编译器路径.

  • CMAKE_C_FLAGS CMAKE_CXX_FLAGS:表示编译 C 和 C++代码时使用的编译选项.

  1. 打印 CMake 预定义宏,观察结果:
cmake_minimum_required(VERSION 3.0)
project(TEST)

# 打印每个预定义宏的值
message("CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")
message("CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
message("CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
message("CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")
message("CMAKE_CURRENT_LIST_DIR: ${CMAKE_CURRENT_LIST_DIR}")
message("CMAKE_MODULE_PATH: ${CMAKE_MODULE_PATH}")
message("CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
message("CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}")
message("CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
message("CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")

在这里插入图片描述

2.3 CMake 的变量

就行一门编程语言一样,之前的函数和输出指令就像学习 C/C++的 print 和#include<stdio.h>一样,同样 CMake 也具有变量的概念,方便用户操作这些变量,完成对项目的编译.

2.3.1 定义变量 set 指令

  1. set 指令用于定义变量, 语法如下:set(<variable> <value> [CACHE <type> <docstring> [FORCE]])
  • <variable>:变量名,可以是任意有效的变量名.
  • <value>:变量的值,可以是一个字符串、路径、列表、布尔值等.
  • CACHE <type> <docstring> [FORCE]:可选参数,用于定义一个缓存变量. 缓存变量可以在命令行或 CMake GUI 中修改; <type>指定变量的类型; <docstring>为变量提供一个描述性字符串; FORCE 选项可用于强制设置缓存变量的值.
cmake_minimum_required(VERSION 3.0)
project(TEST)

# 定义一个普通变量
set(MY_VARIABLE "Hello, CMake!")

# 定义一个路径变量
set(MY_PATH /path/to/some/directory)

# 定义一个列表变量
set(MY_LIST item1 item2 item3)

# 定义一个布尔变量
set(MY_FLAG TRUE)

# 使用 message 指令输出变量的值
message("MY_VARIABLE: ${MY_VARIABLE}")
message("MY_PATH: ${MY_PATH}")
message("MY_LIST: ${MY_LIST}")
message("MY_FLAG: ${MY_FLAG}")

2.3.2 字符串变量值的增加操作

  1. set指令进行字符串变量的拼接:set(<variable> "${<variable>} <string>") 在原有字符串变量的基础上拼接新字符串;
set(MY_STRING "Hello")
set(MY_STRING "${MY_STRING} CMake!")

2.3.3 路径变量值的增加操作

在 CMake 中可以使用set指令和file指令实现对路径变量的增加

  1. set 指令进行路径变量的拼接:set(<variable> "<path1>/<path2>")形式直接将两个路径拼接在一起.
set(MY_PATH "/path/to/some/directory")
set(MY_PATH "${MY_PATH}/subdirectory")
  1. 举例:
cmake_minimum_required(VERSION 3.0)
project(TEST)

# 使用 set 指令进行路径变量的拼接
set(MY_PATH_ORIGIN ${CMAKE_SOURCE_DIR})
set(MY_PATH_TEST "${MY_PATH_ORIGIN}/subdirectory")
set(MY_PATH_SRC ${MY_PATH_ORIGIN}/src)

# 使用 message 指令输出结果
message("MY_PATH_TEST: ${MY_PATH_TEST}")
message("MY_PATH_SRC: " ${MY_PATH_SRC})

在这里插入图片描述

2.3.4 列表变量值的增加操作

在 CMake 中,可以使用 setlist 命令对列表变量进行增加操作.

  1. 使用 set 命令对变量进行增加操作:
  • set(<variable> <value>) 语法来设置一个变量的值。如果该变量已经存在,它的值将被覆盖;
  • set(<variable> ${<variable>} <value>) 形式来在原有值的基础上追加新值;
set(MY_LIST item1 item2) # 设置一个列表变量
set(MY_LIST ${MY_LIST} item3) # 在原有列表变量的基础上追加新元素
  1. 使用 list 命令对变量进行增加操作:
  • list(APPEND <variable> <value1> [<value2> ...]) 向列表变量中追加一个或多个新值.
set(MY_LIST item1 item2) # 设置一个列表变量
list(APPEND MY_LIST item3) # 向列表变量中追加新元素
  1. 示例
cmake_minimum_required(VERSION 3.0)
project(TEST)

add_executable(test main.c hex.h)
target_link_libraries(test m)
cmake_minimum_required(VERSION 3.0)
project(TEST)

# 设置变量
set(MY_LIST item1 item2)
set(MY_LIST ${MY_LIST} item3)
# 使用 message 函数输出结果
message("MY_LIST: ${MY_LIST}")

# 使用 list 命令对变量进行增加操作
set(MY_OTHER_LIST itemA itemB)
list(APPEND MY_OTHER_LIST itemC)
# 使用 message 函数输出结果
message("MY_OTHER_LIST: ${MY_OTHER_LIST}")

在这里插入图片描述

2.3.5 路径变量回到上一级

在 CMake 中,使用get_filename_component函数结合DIRECTORY选项来实现: get_filename_component(<variable> ${<variable>} DIRECTORY)

cmake_minimum_required(VERSION 3.0)
project(TEST)

set(MY_PATH "${CMAKE_SOURCE_DIR}")

get_filename_component(MY_PARENT_DIR ${MY_PATH} DIRECTORY)

message("MY_PARENT_DIR: ${MY_PARENT_DIR}")

在这里插入图片描述

2.3.6 列表变量删除元素

使用list(REMOVE_ITEM <variable> <value>)命令来删除一个列表中的元素。该命令将从列表中删除指定的元素

cmake_minimum_required(VERSION 3.0)
project(TEST)

# 定义一个包含元素的列表
set(MY_LIST "apple" "banana" "orange" "grape")

# 输出原始列表
message("Original list: ${MY_LIST}")

# 删除元素
list(REMOVE_ITEM MY_LIST "banana")

# 输出修改后的列表
message("Modified list: ${MY_LIST}")

在这里插入图片描述

2.4 CMake 文件操作

CMake 主要是对 C/C++项目进行管理, 因此它最需要的是具有对文件的操作能力,例如读取到项目中的.c/.cpp/.h/.hpp/.xxx 文件; 或者是重命名等,这里重点还是介绍搜索文件的能力.

2.4.1 file 指令

file指令的用法示例:

Reading
  file(READ <filename> <out-var> [...])
  file(STRINGS <filename> <out-var> [...])
  file(<HASH> <filename> <out-var>)
  file(TIMESTAMP <filename> <out-var> [...])
  file(GET_RUNTIME_DEPENDENCIES [...])

Writing
  file({WRITE | APPEND} <filename> <content>...)
  file({TOUCH | TOUCH_NOCREATE} [<file>...])
  file(GENERATE OUTPUT <output-file> [...])
  file(CONFIGURE OUTPUT <output-file> CONTENT <content> [...])

Filesystem
  file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])
  file(MAKE_DIRECTORY [<dir>...])
  file({REMOVE | REMOVE_RECURSE } [<files>...])
  file(RENAME <oldname> <newname> [...])
  file(COPY_FILE <oldname> <newname> [...])
  file({COPY | INSTALL} <file>... DESTINATION <dir> [...])
  file(SIZE <filename> <out-var>)
  file(READ_SYMLINK <linkname> <out-var>)
  file(CREATE_LINK <original> <linkname> [...])
  file(CHMOD <files>... <directories>... PERMISSIONS <permissions>... [...])
  file(CHMOD_RECURSE <files>... <directories>... PERMISSIONS <permissions>... [...])

Path Conversion
  file(REAL_PATH <path> <out-var> [BASE_DIRECTORY <dir>] [EXPAND_TILDE])
  file(RELATIVE_PATH <out-var> <directory> <file>)
  file({TO_CMAKE_PATH | TO_NATIVE_PATH} <path> <out-var>)

Transfer
  file(DOWNLOAD <url> [<file>] [...])
  file(UPLOAD <file> <url> [...])

Locking
  file(LOCK <path> [...])

Archiving
  file(ARCHIVE_CREATE OUTPUT <archive> PATHS <paths>... [...])
  file(ARCHIVE_EXTRACT INPUT <archive> [...])
  1. 复制文件:file(COPY ...): 做个了解.

  2. 删除文件: file(REMOVE ...): 做个了解.

  3. 创建目录: file(MAKE_DIRECTORY ...): 做个了解

  4. 获取指定文件夹下的文件并存入变量: file(GLOB <variable> ...): 将指定目录下的搜索文件存储到一个变量中,其中匹配的规则可以是通配符模式,也可以采用正则表达式.

  5. 遍历获取文件并存入变量: file(GLOB_RECURSE <variable> ...): 遍历某个文件夹下的文件,将搜索文件存储到一个变量中.

cmake_minimum_required(VERSION 3.0)
project(TEST)

file(GLOB CMAKE_DIR_FILES ${CMAKE_SOURCE_DIR}/CMakeFiles/*.cmake)
message("RESULT: ${CMAKE_DIR_FILES}")

file(GLOB_RECURSE CMAKE_DEEP_FILES ${CMAKE_SOURCE_DIR}/CMakeFiles/*.cmake)
message("RESULT: ${CMAKE_DEEP_FILES}")

在这里插入图片描述

2.4.2 其他指令

aux_source_directory在官网中划分为 CMake 的project commands.
官方 aux_source_directory 指导

aux_source_directory: 相当于搜索目录下的源文件,这个源文件的类型是.c/.cpp/.h/.hpp 或者是其他的脚本语言的后缀, 如果目录下没有这些脚本文件,则为空.

cmake_minimum_required(VERSION 3.0)
project(TEST)

aux_source_directory(${CMAKE_SOURCE_DIR}/CMakeFiles CMAK_NOT_NOW_FILES)
message("CMakeFiles RESULT: ${CMAK_NOT_NOW_FILES}")

aux_source_directory(${CMAKE_SOURCE_DIR} CMAKE_NOW_FILES)
message("NOW RESULT: ${CMAKE_NOW_FILES}")

在这里插入图片描述

2.5 CMake 的逻辑语法指令

简单介绍 CMake 工具的逻辑语句的命令的主要作用,这部分很类似于 C/C++代码中的for, if/else等等…, 用于控制流程、条件判断和循环迭代.

2.5.1 判断语句 if/else

  1. if/else 用法:
if(condition) # 如果条件为真,执行这里的代码
else() # 如果条件为假,执行这里的代码
endif()
  1. 示例, 判断当前操作系统的类型:
cmake_minimum_required(VERSION 3.0)
project(TEST)

if(WIN32)
message("Running on Windows")
elseif(APPLE)
message("Running on macOS")
elseif(UNIX)
message("Running on Linux")
else()
message("Sorry i dont know.")
endif()

在这里插入图片描述

2.5.2 循环语句 foreach

  1. foreach 命令用法:
foreach(var IN items) # 对每个元素执行这里的代码
endforeach()
  1. 示例:
set(LIST_ITEMS "apple" "banana" "orange")
foreach(item IN LISTS LIST_ITEMS)
message("Fruit: ${item}")
endforeach()

在这里插入图片描述

2.5.3 选项指令 option

  1. option命令用法, 与if/else语句的区别在于, option更适合用作配置操作的选择:
option(option_name "option_description" [initial_value])
  1. 示例:
cmake_minimum_required(VERSION 3.0)
project(TEST)

option(USE_FEATURE "Enable feature" ON)
if(USE_FEATURE)
message("Feature enabled")
else()
message("Feature disabled")
endif()

在这里插入图片描述

2.5.4 其他指令的主要功能

  • unset:用于取消设置变量.

  • set_directory_properties:用于设置目录属性.

  • set_property:用于设置属性的值.

  • site_name:用于设置或查询当前 CMake 脚本的源文件名.

  • mark_as_advanced:将变量标记为高级选项,使其在 GUI 中不可见.

  • math:提供了一些数学运算函数.

  • cmake_host_system_information:用于获取有关主机系统的信息,例如操作系统类型、处理器类型等.

  • cmake_language:用于指定 CMake 语言版本.

  • cmake_minimum_required:用于指定所需的最低 CMake 版本.

  • cmake_parse_arguments:用于解析命令行参数,并将其存储在变量中.

  • cmake_path:提供了一些与路径相关的函数,例如获取文件名、扩展名等.

  • cmake_policy:用于设置或查询 CMake 的策略.

  • block:用于定义一个代码块,可以在该块中定义变量、函数和其他 CMake 指令.

  • endblock:结束一个代码块.

  • configure_file:用于通过替换文件中的变量来生成新文件.

  • continue:用于跳过当前循环中的剩余代码,并继续下一次循环迭代.

  • break:用于终止当前正在执行的循环.

  • endforeach:结束一个 foreach 循环.

  • while:用于创建一个循环,只要条件为真,就会一直执行循环体中的代码.

  • endwhile:结束一个 while 循环.

  • function:用于定义一个函数.

  • endfunction:结束一个函数定义.

  • return:从函数中返回.

  • macro:用于定义一个宏.

  • endmacro:结束一个宏定义.

  • include:用于包含其他 CMake 脚本.

  • include_guard:用于防止多次包含同一个文件.

  • execute_process:用于在构建过程中执行外部进程.

  • find_filefind_libraryfind_packagefind_pathfind_program:用于在系统中查找文件、库、包、路径和可执行程序.

  • get_cmake_propertyget_directory_propertyget_filename_componentget_property:用于获取 CMake 属性和变量的值.

  • string:提供了一些与字符串相关的函数,例如截取、替换、转换等.

  • separate_arguments:用于将字符串参数分割为独立的参数.

  • variable_watch:用于在变量更改时触发自定义操作.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1018624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全:保护你的系统

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

利用cms主题构造木马(CVE-2022-26965)

简介 CVE-2022-26965是Pluck CMS 4.7.16版本存在一个远程shell上传执行漏洞。 攻击者可利用此漏洞通过构造恶意的主题包进行上传并执行&#xff0c;未经授权访问服务器&#xff0c;造成潜在的安全隐患。 过程 1.打开环境&#xff0c;查看源码&#xff0c;发现login.php 2.进…

JUnit测试进阶(Private测试)

Private测试 前言一、间接调用二、Java反射机制调用 前言 在单元测试中&#xff0c;由于私有方法&#xff08;Private Method&#xff09;无法直接被调用&#xff0c;因此对私有方法进行测试成为一项难题。一个可行的方法是&#xff1a;在测试时将私有方法改变为公有方法&…

R语言绘制PCA双标图、碎石图、变量载荷图和变量贡献图

1、原论文数据双标图 代码&#xff1a; setwd("D:/Desktop/0000/R") #更改路径#导入数据 df <- read.table("Input data.csv", header T, sep ",")# ----------------------------------- #所需的包: packages <- c("ggplot2&quo…

SkyWalking快速上手(一)——安装单机版SkyWalking、使用SkyWalking

文章目录 什么是SkyWalking为什么选择SkyWalking安装步骤前置条件环境要求下载 SkyWalking 配置 SkyWalkingSkywalking 使用Agent 配置Collector 配置 启动 SkyWalking配置SkyWalking代理 SkyWalking的监控功能分布式调用链追踪性能指标监控告警和报警 总结 什么是SkyWalking …

自然语言处理实战项目18-NLP模型训练中的Logits与损失函数的计算应用项目

大家好,我是微学AI,今天给大家介绍一下,自然语言处理实战项目18-NLP模型训练中的Logits与损失函数的计算应用项目,在NLP模型训练中,Logits常用于计算损失函数并进行优化。损失函数的计算是用来衡量模型预测结果与真实标签之间的差异,从而指导模型参数的更新。 Logits是模…

Jenkins自动化:简化部署流程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

[JAVEee]SpringBoot项目的创建

SpringBoot可以更好的开发Spring项目,本文章将使用idea社区版来演示创建项目的过程与注意事项. SpringBoot的优点 SpringBoot中内置快速添加依赖的功能,能够便捷的集成各种框架,帮助开发.内置运行容器,无需配置Tomcat容器等其他web容器,可直接进行项目的部署与运行.更好的使用…

解决秋叶整合包(绘世2.2.19)isnet Pro无法抠图的问题

查看错误输出 ImportError: Imageio Pillow requires Pillow, not PIL!解决方法&#xff1a; 更新新的pilow版本 进入秋叶整合包下的python&#xff0c;用shift右键 运行指令&#xff1a;&#xff08;注意./是必须的&#xff09; ./python -m pip list找到pillow发现版本低…

微服务保护-流量控制1

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

Learn Prompt-角色扮演

模拟面试​ 当你在新闻中读到更多关于ChatGPT的内容时&#xff0c;你会听说ChatGPT可以代替医生、面试官、教师、律师等。但如果你想在实践中使用它&#xff0c;除了使用简单的提示或例子&#xff0c;你还可以根据不同的场景为ChatGPT设置不同的角色&#xff0c;这样我们就可以…

基于matlab寻找并显示一维数组t中的素数

一、方法介绍 首先&#xff0c;要编写一个寻找素数的子函数&#xff1a; function primeNumbers findPrimeNumbers(t)primeNumbers [];for i 1:length(t)num t(i);isPrime true;if num < 1isPrime false;elsefor j 2:sqrt(num)if mod(num, j) 0isPrime false;brea…

Learn Prompt-“标准“提示

在前面的教程中&#xff0c;我们介绍了指令输入的简单提示&#xff0c;提供实例的提示和角色扮演类的提示&#xff0c;那么是否有一个公式来列出提示的各个部分&#xff0c;并将其组合成一个标准化的提示&#xff1f;答案是肯定的。 角色扮演&#xff08;Role&#xff09; 指令…

Ae 效果:CC Hair

模拟/CC Hair Simulation/CC Hair CC Hair&#xff08;CC 毛发&#xff09;可以在源图像上模拟生成毛发、绒线等&#xff0c;并可调整它们的长度、方向、重量等属性&#xff0c;从而创建出非常独特的效果。 CC Hair 本质上是基于 Alpha 通道来生成毛发&#xff0c;无毛发处将变…

多款大模型向公众开放,百模大战再升级?

作为一种使用大量文本数据训练的深度学习模型&#xff0c;大模型可以生成自然语言文本或理解语言文本的含义&#xff0c;是通向人工智能的一条重要途径。大模型可以应用于各种机器学习任务&#xff0c;包括自然语言处理、计算机视觉、语音识别、机器翻译、推荐系统、强化学习等…

【电子元件】常用电子元器件的识别之二极管

目录 前言1. 二极管的识别1.1 普通整流二极管/开关二极管的识别1.2 快速恢复二极管的识别1.3 肖特基二极管的识别1.4 稳压(齐纳)二极管的识别1.5 发光二极管的识别1.6 整流桥的识别1.7 检波二极管的识别1.8 变容二极管的识别1.9 双向触发二极管的识别1.10 二极管在电路图中的…

【记录】深度学习环境配置(pytorch版)

1080面对Transformer连勉强也算不上了&#xff0c;还是要去用小组公用的卡 完整记一个环境配置&#xff0c;方便后面自用✍️ nvidia-smi查看GPU信息 ** CUDA版本12.2 conda -V查询conda版本 22.9.0 新建conda环境 准备装python3.8 conda create --name caiman python3.8.2激…

五层网络模型

分层的意义 当遇到一个复杂问题的时候&#xff0c;可以使用分层的思想把问题简单化 比如&#xff0c;你有半杯82年的可乐&#xff0c;想分享给你的朋友王富贵&#xff0c;但你们已经10年没有联系了。要完成这件事&#xff0c;你可能要考虑&#xff1a; 我用什么装可乐&#x…

shell脚本学习教程(一)

shell脚本学习 一、什么是 Shell&#xff1f;1. shell概述2. Shell 的分类3. 第一个shell脚本4. 多命令执行 二、Shell 变量3.1 变量的命名规则3.2 变量的特殊符号3.3 用户自定义变量3.4 环境变量3.5 位置参数变量3.6 预定义变量3.7 接受键盘输入 三、Shell 运算符3.1 算术运算…

NSSCTF web 刷题记录2

文章目录 前言题目[广东强网杯 2021 团队组]love_Pokemon[NCTF 2018]Easy_Audit[安洵杯 2019]easy_web[NCTF 2018]全球最大交友网站prize_p2[羊城杯 2020]easyser[FBCTF 2019]rceservice方法一方法二 前言 今天是2023年9月13号&#xff0c;刷题记录2正式开始。时间来到九月十七…