CMake中file的使用

news2025/7/18 15:10:48

      CMake中的file命令用于文件操作,其文件格式如下:此命令专用于需要访问文件系统的文件和路径操作

Reading
  file(READ <filename> <variable>
     [OFFSET <offset>] [LIMIT <max-in>] [HEX])
  file(STRINGS <filename> <variable> [<options>...])
  file(<HASH> <filename> <out-var>)
  file(TIMESTAMP <filename> <variable> [<format>] [UTC])
  file(GET_RUNTIME_DEPENDENCIES
    [RESOLVED_DEPENDENCIES_VAR <deps_var>]
    [UNRESOLVED_DEPENDENCIES_VAR <unresolved_deps_var>]
    [CONFLICTING_DEPENDENCIES_PREFIX <conflicting_deps_prefix>]
    [EXECUTABLES [<executable_files>...]]
    [LIBRARIES [<library_files>...]]
    [MODULES [<module_files>...]]
    [DIRECTORIES [<directories>...]]
    [BUNDLE_EXECUTABLE <bundle_executable_file>]
    [PRE_INCLUDE_REGEXES [<regexes>...]]
    [PRE_EXCLUDE_REGEXES [<regexes>...]]
    [POST_INCLUDE_REGEXES [<regexes>...]]
    [POST_EXCLUDE_REGEXES [<regexes>...]]
    [POST_INCLUDE_FILES [<files>...]]
    [POST_EXCLUDE_FILES [<files>...]])

Writing
  file({WRITE | APPEND} <filename> <content>...)
  file({TOUCH | TOUCH_NOCREATE} [<file>...])
  file(GENERATE OUTPUT output-file
     <INPUT input-file|CONTENT content>
     [CONDITION expression] [TARGET target]
     [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
      FILE_PERMISSIONS <permissions>...]
     [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
  file(CONFIGURE OUTPUT output-file
     CONTENT content
     [ESCAPE_QUOTES] [@ONLY]
     [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

Filesystem
  file(GLOB <variable>
     [LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
     [<globbing-expressions>...])
  file(GLOB_RECURSE <variable> [FOLLOW_SYMLINKS]
     [LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
     [<globbing-expressions>...])
  file(MAKE_DIRECTORY [<dir>...])
  file({REMOVE | REMOVE_RECURSE } [<files>...])
  file(RENAME <oldname> <newname>
     [RESULT <result>]
     [NO_REPLACE])
  file(COPY_FILE <oldname> <newname>
     [RESULT <result>]
     [ONLY_IF_DIFFERENT])
  file(<COPY|INSTALL> <files>... DESTINATION <dir>
     [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS]
     [FILE_PERMISSIONS <permissions>...]
     [DIRECTORY_PERMISSIONS <permissions>...]
     [FOLLOW_SYMLINK_CHAIN]
     [FILES_MATCHING]
     [[PATTERN <pattern> | REGEX <regex>]
      [EXCLUDE] [PERMISSIONS <permissions>...]] [...])
  file(SIZE <filename> <out-var>)
  file(READ_SYMLINK <linkname> <out-var>)
  file(CREATE_LINK <original> <linkname>
     [RESULT <result>] [COPY_ON_ERROR] [SYMBOLIC])
  file(CHMOD <files>... <directories>...
    [PERMISSIONS <permissions>...]
    [FILE_PERMISSIONS <permissions>...]
    [DIRECTORY_PERMISSIONS <permissions>...])
  file(CHMOD_RECURSE <files>... <directories>...
     [PERMISSIONS <permissions>...]
     [FILE_PERMISSIONS <permissions>...]
     [DIRECTORY_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>] [<options>...])
  file(UPLOAD   <file> <url> [<options>...])

Locking
  file(LOCK <path> [DIRECTORY] [RELEASE]
     [GUARD <FUNCTION|FILE|PROCESS>]
     [RESULT_VARIABLE <variable>]
     [TIMEOUT <seconds>])

Archiving
  file(ARCHIVE_CREATE OUTPUT <archive>
    PATHS <paths>...
    [FORMAT <format>]
    [COMPRESSION <compression> [COMPRESSION_LEVEL <compression-level>]]
    [MTIME <mtime>]
    [VERBOSE])
  file(ARCHIVE_EXTRACT INPUT <archive>
    [DESTINATION <dir>]
    [PATTERNS <patterns>...]
    [LIST_ONLY]
    [VERBOSE]
    [TOUCH])

      1.Reading:
      (1).READ:从名为<filename>的文件中读取内容,并将其存储在<variable>中。可选项,从给定的<offset>开始,最多读取<max-in>个字节。HEX选项将数据转换为十六进制表示。如果指定了HEX,则输出(a到f)中的字母均为小写。
      (2).STRINGS:解析<filename>中的ASCII字符串列表并将其存储在<variable>中。文件中的二进制数据被忽略。回车符(\r, CR)被忽略。选项包括:LENGTH_MAXIMUM,仅考虑不超过指定长度的字符串;类似的还包括LENGTH_MINIMUM, LIMIT_COUNT, LIMIT_INPUT, LIMIT_OUTPUT, NEWLINE_CONSUME, NO_HEX_CONVERSION, REGEX, ENCODING.
      (3).<HASH>:计算<filename>内容的加密hash,并将其存储在<out-var>中。支持的hash算法是string(<HASH>)命令中列出的名称。
      (4).TIMESTAMP:计算<filename>修改时间的字符串表示时间并将其存储在<variable>中。如果命令无法获得时间戳变量,则将其设置为空字符串("").选项<format>和UTC参考string(TIMESTAMP)命令。
      (5).GET_RUNTIME_DEPENDENCIES:递归地获取给定文件所依赖的库列表。注意:此子命令不适用于project mode,它旨在install时使用。

file(READ CMakeLists.txt var OFFSET 0 LIMIT 36)
# Note:var结果输出中会有个空行
message("var: ${var}") # var: cmake_minimum_required(VERSION 3.22)

file(STRINGS CMakeLists.txt var)
# Note:单行输出,行与行之间使用";"分开
message("var: ${var}") # var: cmake_minimum_required(VERSION 3.22);project(cmake_feature_usage);;message("#### current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}");include(test_${TEST_CMAKE_FEATURE}.cmake);message("==== test finish ====")
file(STRINGS CMakeLists.txt var LENGTH_MAXIMUM 5)
# Note:长度超过5的字符串会使用";"分开,但是内容并不会减少
message("var: ${var}") # var: cmake;_mini;mum_r;equir;ed(VE;RSION; 3.22;);proje;ct(cm;ake_f;eatur;e_usa;ge);;messa;ge("#;### c;urren;t cma;ke ve;rsion;: ${C;MAKE_;MAJOR;_VERS;ION}.;${CMA;KE_MI;NOR_V;ERSIO;N}.${;CMAKE;_PATC;H_VER;SION};");inclu;de(te;st_${;TEST_;CMAKE;_FEAT;URE}.;cmake;);messa;ge("=;=== t;est f;inish; ====;")

file(MD5 ../CMakeLists.txt var)
message("var: ${var}") # var: 078ae43310e4d60a20915d00c9953713

file(TIMESTAMP ../CMakeLists.txt var)
message("var: ${var}") # var: 2022-10-26T10:24:59
file(TIMESTAMP ../CMakeLists.txt var %B:%U UTC)
message("var: ${var}") # var: October:43

      2.Writing:
      (1).WRITE,APPEND:将<content>写入名为<filename>的文件。如果该文件不存在则会创建它。如果文件已经存在,WRITE模式将覆盖它,APPEND模式将追加到末尾。<filename>指定的路径中不存在的所有目录都将被创建。
      (2).TOUCH,TOUCH_NOCREATE:如果<file>不存在,则创建一个不包含任何内容的<file>。如果<file>已经存在,那么它的访问和/或修改将更新到函数调用被执行的时间
      如果存在<file>,则使用TOUCH_NOCREATE来touch它,但不创建它。如果<file>不存在,它将被忽略。
      使用TOUCH和TOUCH_NOCREATE将不会修改现有文件的内容。
      (3).GENERATE:为当前CMake Generator支持的每个构建配置(build configuration)生成一个输出文件。根据输入内容评估generator expressions,以生成输出内容。
      注意:file(GENERATE)直到生成阶段(generation phase)才创建输出文件。当file(GENERATE)命令返回时,尚未写入输出文件,仅在处理了project的所有CMakeLists.txt文件后才写入输入文件。
      (4).CONFIGURE:使用CONTENT给出的输入生成一个输出文件,并替换其中包含的@VAR@或${VAR}变量值。替换规则的行为与configure_file命令相同。为了匹配configure_file的行为,OUTPUT和CONTENT都不支持generator expressions。

file(WRITE tmp.txt "csdn addr: https://blog.csdn.net/fengbingchun")
file(APPEND tmp.txt "github addr: https://github.com/fengbingchun")
file(READ tmp.txt var)
message("var: ${var}") # var: csdn addr: https://blog.csdn.net/fengbingchungithub addr: https://github.com/fengbingchun

file(TOUCH_NOCREATE CMakeLists.txt)
file(TIMESTAMP ../CMakeLists.txt var)
message("var: ${var}") # var: 2022-11-21T14:42:05

      3.Filesystem:
      (1).GLOB,GLOB_RECURSE:生成与<globbing-expressions>匹配的文件列表,并将其存储到<variable>中。
      如果指定了RELATIVE标志,则结果将作为给定路径的相对路径返回。
      默认情况下,GLOB列出目录(lists directories),如果LIST_DIRECTORIES设置为false,则目录将被省略。
      注意:不建议使用GLOB从源树(source tree)中收集源文件列表。如果在添加或删除源时没有CMakeLists.txt文件更改,则生成的构建系统将不知道何时要求CMake重新生成。
      GLOB_RECURSE模式将遍历匹配目录下的所有子目录和匹配的文件。只有在给出FOLLOW_SYMLINKS或策略CMP0009没有设置为NEW时,才会遍历符号链接(symlink)的子目录。
      (2).MAKE_DIRECTORY:根据需要创建给定的目录及其父目录
      (3).REMOVE,REMOVE_RECURSE:删除给定的文件。REMOVE_RECURSE模式将删除给定的文件和目录,以及非空目录。如果给定的文件不存在,不会触发error。相对输入路径是相对于当前源目录进行评估的(evaluated)。
      (4).RENAME:将文件系统中的文件或目录从<oldname>移动到<newname>,自动替换目标位置。选项包括RESULT和NO_REPLACE:
      如果指定了RESULT,成功时将<result>设置为0,否则设置为错误消息。如果未指定RESULT且此操作失败,则会触发error.
      如果指定了NO_REPLACE,如果<newname>路径已经存在则不会替换它。如果指定了RESULT,则<result>将设置为NO_REPLACE,否则将触发error.
      (5).COPY_FILE:将文件从<oldname>拷贝到<newname>不支持目录拷贝。符号链接被忽略,<oldname>的内容作为一个新文件被读取和写入到<newname>。
      选项包括RESULT和ONLY_IF_DIFFERENT:
      如果指定了RESULT,成功时将<result>设置为0,否则设置为错误消息。如果未指定RESULT且此操作失败,则会触发error.
      如果指定了ONLY_IF_DIFFERENT,如果<newname>路径已经存在,且此文件的内容与<oldname>相同,则不执行拷贝(这样可以避免更新<newname>的时间戳).
      此子命令与带有COPYONLY选项的configure_file命令有一些相似之处。一个重要的区别是configure_file创建了对源文件的依赖,因此如果CMake发生更改,它将重新运行。file(COPY_FILE)子命令不会创建这样的依赖。
      (6).COPY,INSTALL:COPY签名将文件、目录和符号链接拷贝到目标文件夹。相对输入路径是相对于当前源目录进行评估的(evaluated),相对目标路径是相对于当前构建目录进行评估的。拷贝保留输入文件的时间戳,如果文件存在于具有相同时间戳的目标位置,则优化该文件。拷贝保留输入权限,除非给出明确的权限或NO_SOURCE_PERMISSIONS(默认为USE_SOURCE_PERMISSIONS)。
      如果指定了FOLLOW_SYMLINK_CHAIN,COPY将在给定的路径上递归解析符号链接,直到找到真正的文件,并在目标位置为遇到的每个符号链接安装相应的符号链接。此功能在某些Unix系统上非常有用。
      有关权限、FILES_MATCHING, PATTERN, REGEX和EXCLUDE选项,可参考install(DIRECTORY)命令。
      INSTALL签名与COPY签名稍有不同:它打印状态信息,并且NO_SOURCE_PERMISSIONS是默认值。
      环境变量CMAKE_INSTALL_MODE可以覆盖file(INSTALL)的默认拷贝行为。
      (7).SIZE:确定<filename>文件的大小,并将结果存入<out-var>。要求<filename>是指向有效路径并且可读。
      (8).READ_SYMLINK:查询符号链接<linkname>并将其指向的路径存储在<out-var>中。如果<linkname>不存在或不是符号链接,CMake会触发fatal error.
      注意:该命令返回的是原始的符号链接路径,而不是相对路径。
      (9).CREATE_LINK:创建指向<original>的链接<linkname>。默认情况下,它将是硬链接(hard link),但是提供SYMBOLIC选项会导致符号链接。硬链接要求<original>存在并且是文件而不是目录。如果<linkname>已经存在,它将被覆盖。
      如果指定了RESULT,成功时将<result>设置为0,否则设置为错误消息。如果未指定RESULT且此操作失败,则会触发error.
      (10).CHMOD:为<files>和<directories>指定权限。有效权限有OWNER_READ,OWNER_WRITE, OWNER_EXECUTE, GROUP_READ, GROUP_WRITE, GROUP_EXECUTE, WORLD_READ, WORLD_WRITE, WORLD_EXECUTE, SETUID, SETGID.
      (11).CHMOD_RECURSE:与CHMOD相同,但是递归更改<directories>中存在的文件和目录的权限。

file(GLOB var *.txt)
message("var: ${var}") # var: /home/spring/GitHub/Linux_Code_Test/Samples_CMake/messy_usage/CMakeLists.txt;/home/spring/GitHub/Linux_Code_Test/Samples_CMake/messy_usage/tmp.txt

file(GLOB var RELATIVE /home/spring/GitHub/ *.txt )
message("var: ${var}") # var: Linux_Code_Test/Samples_CMake/messy_usage/CMakeLists.txt;Linux_Code_Test/Samples_CMake/messy_usage/tmp.txt

# Note:LIST_DIRECTORIES的设置好像没有生效??
file(GLOB var LIST_DIRECTORIES false *.txt )
message("var: ${var}") # var: /home/spring/GitHub/Linux_Code_Test/Samples_CMake/messy_usage/CMakeLists.txt;/home/spring/GitHub/Linux_Code_Test/Samples_CMake/messy_usage/tmp.txt

file(MAKE_DIRECTORY tmp1/tmp2)
file(REMOVE_RECURSE tmp1/tmp2)

file(REMOVE_RECURSE build/tmp2)
file(RENAME tmp1 build/tmp2 RESULT result)
message("result: ${result}") # result: 0

file(COPY_FILE CMakeLists.txt build/tmp.txt RESULT result)
message("result: ${result}") # result: 0

file(COPY ../complex_usage ../special_usage DESTINATION .)
file(INSTALL ../multi_executable_file DESTINATION .) # -- Installing: /home/spring/GitHub/Linux_Code_Test/Samples_CMake/messy_usage/build/./multi_executable_file

file(SIZE ../CMakeLists.txt var)
message("var: ${var}") # var: 250

set(linkname "/usr/bin/gcc")
file(READ_SYMLINK ${linkname} var)
message("var: ${var}") # var: gcc-11
if(NOT IS_ABSOLUTE "${ver}")
    get_filename_component(dir ${linkname} DIRECTORY)
    set(result ${dir}/${var})
endif()
message("result: ${result}") # result: /usr/bin/gcc-11

file(CREATE_LINK build.sh tmp3 RESULT result SYMBOLIC)
message("result: ${result}") # result: failed to create symbolic link 'tmp3': Operation not permitted ????

file(CHMOD tmp.txt FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE) # build/tmp.txt

      4.Path Conversion:
      (1).REAL_PATH:计算现有文件或目录的绝对路径,并解析符号链接。
      如果指定了BASE_DIRECTORY,如果提供的<path>是相对路径,则会相对于给定的基本目录<dir>进行评估。如果没有提供基本目录<dir>,则默认基本目录将为CMAKE_CURRENT_SOURCE_DIR。
      如果指定了EXPAND_TILDE,如果<path>是~或以~/开头,~将替换为用户的主目录(home directory)。主目录的路径是从环境变量中获得的。
      (2).RELATIVE_PATH:计算从<directory>到<file>的相对路径,并将其存储在<out-var>中。
      (3).TO_CMAKE_PATH:将native <path>转换为正斜杠(/)的cmake-style路径。
      TO_NATIVE_PATH:将cmake-style <path>转换为带有特定平台斜杠(在Windows上为\,其它平台为/)的native路径。
      始终在<path>周围使用双引号,以确保它被视为该命令的单个参数

file(REAL_PATH build.sh var)
message("var: ${var}") # var: /home/spring/GitHub/Linux_Code_Test/Samples_CMake/messy_usage/build.sh
file(REAL_PATH gcc var BASE_DIRECTORY /usr/bin)
message("var: ${var}") # var: /usr/bin/x86_64-linux-gnu-gcc-11

file(RELATIVE_PATH var ${CMAKE_CURRENT_SOURCE_DIR} /usr/bin/gcc)
message("var: ${var}") # var: ../../../../../../usr/bin/gcc

file(TO_CMAKE_PATH "/usr/bin/cmake" var)
message("var: ${var}") # var: /usr/bin/cmake

      5.Transfer:
      (1).DOWNLOAD:下载指定的<url>到本地的<file>.
      (2).UPLOAD:上传本地的<file>到指定的<url>.
      如果未为file(DOWNLOAD)指定<file>,则不会保存文件。如果你想知道是否可以下载文件(例如,检查文件是否存在)而无需将其保存在任何地方,则此功能很有用。
      DOWNLOAD和UPLOAD选项有:INACTIVITY_TIMEOUT, LOG, SHOW_PROGRESS, STATUS, TIMEOUT, USERPWD, HTTPHEADER, NETRC, NETRC_FILE, TLS_VERIFY, TLS_CAINFO.
      DOWNLOAD的其它选项还包括:EXPECTED_HASH, EXPECTED_MD5, RANGE_START, RANGE_END.

file(DOWNLOAD https://github.com/fengbingchun/Linux_Code_Test/blob/master/Samples_CMake/messy_usage/CMakeLists.txt cmakelists.txt
    LOG var STATUS var2) # cmakelists.txt保存到build目录下
message("var: ${var}") # var:   Trying 20.205.243.166:443...
                        # Connected to github.com (20.205.243.166) port 443 (#0)
message("var2: ${var2}") # var2: 0;"No error"

      6.Locking:如果不存在DIRECTORY选项,则锁定由<path>指定的文件,否则锁定<path>/cmake.lock文件。
      注意:锁是建议性的,不能保证其它进程也会尊重此锁。不允许尝试两次锁定文件。

file(LOCK build DIRECTORY RESULT_VARIABLE var) # build目录下会生成cmake.lock文件
message("var: ${var}") # var: 0

      7.Archiving:
      (1).ARCHIVE_CREATE:用<paths>中列出的文件和目录创建指定的<archive>文件。注意:<paths>必须列出实际文件或目录,不支持通配符(wildcards).
      FORMAT选项支持的格式有7zip, gnutar, pax, paxr, raw和zip。如果没有指定FORMAT,则默认格式为paxr。
      VERBOSE选项为存档操作启用详细输出。
      (2).ARCHIVE_EXTRACT:提取或列出指定的<archive>的内容。可以使用DESTINATION选项指定将存档(archive)内容提取到的目录。如果目录不存在,将创建该目录。如果未给出DESTINATION,将使用当前的二进制目录。
      如果需要,可以使用指定的<patterns>选择要从存档中列出和提取的文件和目录。支持通配符。如果未给出PATTERNS,则将列出或提取整个存档。
      LIST_ONLY将列出存档中的文件,而不是提取它们。
      TOUCH选项为提取的文件提供当前本地时间戳,而不是从存档中提取文件时间戳。
      使用VERBOSE,该命令将产生详细输出。

file(ARCHIVE_CREATE OUTPUT tmp.zip PATHS ../CMakeLists.txt FORMAT zip VERBOSE) # 在build目录下生成tmp.zip
file(ARCHIVE_EXTRACT INPUT tmp.zip DESTINATION xxxx VERBOSE) # 在build目录下解析tmp.zip,但是在build/xxxx目录下并不存在CMakeLists.txt ????
file(ARCHIVE_EXTRACT INPUT tmp.zip LIST_ONLY VERBOSE) # -rw-r--r--  0 0      0         250 21 Nov 14:42 ../CMakeLists.txt

      执行上述测试代码需要3个文件:build.sh, CMakeLists.txt, test_file.cmake

      build.sh内容如下:

#! /bin/bash

# supported input parameters(cmake commands)
params=(function macro cmake_parse_arguments \
		find_library find_path find_file find_program find_package \
		cmake_policy cmake_minimum_required project include \
		string list set foreach message option if while return \
		math file configure_file \
		include_directories)

usage()
{
	echo "Error: $0 needs to have an input parameter"

	echo "supported input parameters:"
	for param in ${params[@]}; do
		echo "  $0 ${param}"
	done

	exit -1
}

if [ $# != 1 ]; then
	usage
fi

flag=0
for param in ${params[@]}; do
	if [ $1 == ${param} ]; then
		flag=1
		break
	fi
done

if [ ${flag} == 0 ]; then
	echo "Error: parameter \"$1\" is not supported"
	usage
	exit -1
fi

if [[ ! -d "build" ]]; then
	mkdir build
	cd build
else
	cd build
fi

echo "==== test $1 ===="

# test_set.cmake: cmake -DTEST_CMAKE_FEATURE=$1 --log-level=verbose ..
# test_option.cmake: cmake -DTEST_CMAKE_FEATURE=$1 -DBUILD_PYTORCH=ON ..
cmake -DTEST_CMAKE_FEATURE=$1 ..
# It can be executed directly on the terminal, no need to execute build.sh, for example: cmake -P test_set.cmake
make

      CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.22)
project(cmake_feature_usage)

message("#### current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
include(test_${TEST_CMAKE_FEATURE}.cmake)
message("==== test finish ====")

      test_file.cmake:为上面的所有示例代码

      可能的执行结果如下图所示:

      GitHub:https://github.com/fengbingchun/Linux_Code_Test

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

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

相关文章

Java8-新特性及Lambda表达式

1、Java8新特性内容概述 1.1、简介 Java 8(又称为jdk1.8)是Java语言开发的一个主要版本 Java 8是oracle公司于2014年3月发布&#xff0c;可以看成是自Java 5以来最具革命性的版本。Java 8为Java语言、编译器、类库、开发工具与JVM带来了大量新特性 1.2、新特性思维导图总结 1.…

JS中数组随机排序实现(原地算法sort/shuffle算法)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;专注于前端领域各种技术&#xff0c;热衷分享&#xff0c;期待你的关注。 &#x1f4ab;系列专栏&#xff1a;vue3从入门到精通 &#x1f4dd;个人签名&#xff1a;不破不立 目录一、原地…

代码随想录刷题|LeetCode 70. 爬楼梯(进阶) 322. 零钱兑换 279.完全平方数 139.单词拆分

目录 70. 爬楼梯 &#xff08;进阶&#xff09; 思路 爬楼梯 1或2步爬楼梯 多步爬楼梯 322. 零钱兑换 思考 1、确定dp数组及其含义 2、确定递推公式 3、初始化dp数组 4、确定遍历顺序 零钱兑换 先遍历物品&#xff0c;再遍历背包 先遍历背包&#xff0c;再遍历物品 279.完全平方…

【操作系统实验】线程的创建+信号量通信

sem_init: 功能&#xff1a;初始化信号量 返回值&#xff1a;创建成功返回0&#xff0c;失败返回-1 参数sem&#xff1a;指向信号量结构的一个指针 参数pshared&#xff1a;不为&#xff10;时此信号量在进程间共享&#xff0c;为0时当前进程的所有线程共享 参数value&#xf…

react context原理

带着问题思考&#xff1a; 1 Provder 如何传递 context&#xff1f;2 三种获取 context 原理 &#xff08; Consumer&#xff0c; useContext&#xff0c;contextType &#xff09;&#xff1f;3 消费 context 的组件&#xff0c;context 改变&#xff0c;为什么会订阅更新 &a…

Vue+iview将表格table以excel文件导出的几种方式

前言 在日常工作中&#xff0c;若是经常跟后台管理系统打交道的朋友想必对导出excel表格这种需求肯定很熟悉吧。不过我也问了身边的一些岗位为后端工程师的朋友&#xff0c;他们说在公司的话一般导出excel表格的工作一般由后端来做&#xff0c;前端只需要调用接口即可。我的话…

AI面试必备-《家居必备的AI精选资源列表》免费分享

本资源介绍 DeepMind科学家和工程师为有兴趣了解更多人工智能、机器学习和其他相关主题的学生整理的教育资源列表。 文末附本书免费获取地址。 内容截图 本资源免费下载地址 链接: https://pan.baidu.com/s/1IkPk0a3q2Z1z4FATG2y7HA?pwdwy3c 提取码: wy3c 往期精品内容推荐 大…

认知电子战 | 无线电中的认知理论

认知的概念 认知(Cognition)是指人认识外界事务的过程 认知本来是用于描述具有生命特征的物种的,借用于机器或系统上,就是指将认知的思想应用于机器上。 生物的认知特点: 感觉思考、推理、问题解答判断记忆分别对应于系统认知特点: 感知(各种传感器)机器学习算法、基…

算法提升:图的启发式搜索算法(A算法、A*算法)

启发式搜索算法 目录 概念 A算法 A*算法 概念 启发式搜索(Heuristically Search)又称为有信息搜索(Informed Search)&#xff0c;它是利用问题拥有的启发信息来引导搜索&#xff0c;达到减少搜索范围、降低问题复杂度的目的&#xff0c;这种利用启发信息的搜索过程称为启发…

修改 Git 已经提交记录的 用户名 和邮箱

修改 Git 已经提交记录的 用户名 和邮箱 有关 Git 和版本控制的常见问题。 如何更改提交的作者姓名/电子邮件&#xff1f; 在我们进入解决方案之前&#xff0c;让我们找出您到底想要完成什么&#xff1a; 在提交之前更改作者信息在提交后更改作者信息&#xff08;即历史提交…

常见的前端安全问题(xss / csrf / sql / ddos / cdn...)

目录 1. xss&#xff08;Cross Site Scripting&#xff09;跨站脚本攻击 1.1 持久型&#xff08;存储型&#xff09;攻击 / 非持久型&#xff08;反射型&#xff09;攻击 是什么&#xff1f; 1.2 xss 出现的场景&#xff1f;造成的危害&#xff1f; 1.3 防御 xss&#xff0…

three.js之Geometry顶点、颜色数据与三角面

文章目录简介顶点对于代码的解释颜色对于代码的解释三角面专栏目录请点击 简介 Geometry与BufferGeometry表达的含义相同&#xff0c;只是对象的结构不同three.js渲染的时候会先把Geometry转化为BufferGeometry在解析几何体顶点数据进行渲染 顶点 <!DOCTYPE html> <…

基于JavaWeb的药品进销存管理系统(JSP)

目 录 绪论 1 1.1 本课题的研究背景 1 1.2 国内外研究现状 1 1.3 本课题的主要工作 2 1.4 目的和意义 2 开发工具及技术 3 2.1 开发工具 3 2.1.1 MyEclipse 3 2.1.2 Tomcat 3 2.1.3 Mysql 3 2.2 开发技术 4 2.2.1 JSP 4 2.2.2 MyBatis 4 2.2.3 JavaScript 4 2.2.4 jQuery以及j…

机械原理-试题及答案

模拟试题八&#xff08;机械原理A&#xff09; 一、判断题&#xff08;10分&#xff09;[对者画√&#xff0c;错者画 ] 1、对心曲柄滑块机构都具有急回特性。&#xff08; &#xff09; 2、渐开线直齿圆柱齿轮的分度圆与节圆相等。&#xff08; &#xff09; 3、当两直齿圆柱齿…

Spring Cloud OpenFeign - 日志配置

项目源码地址&#xff1a;https://download.csdn.net/download/weixin_42950079/87168704 OpenFeign 有 4 种日志级别&#xff1a; NONE: 不记录任何日志&#xff0c;是OpenFeign默认日志级别&#xff08;性能最佳&#xff0c;适用于生产环境&#xff09;。BASIC: 仅记录请求方…

[附源码]计算机毕业设计JAVA人力资源管理系统论文2022

[附源码]计算机毕业设计JAVA人力资源管理系统论文2022 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM…

QT对象树和菜单操作

前言 可以与MFC框架进行比较&#xff0c;总结彼此的相同点和不同点&#xff0c;在此基础上再去学习其他的界面框架&#xff0c;达到增量学习的境界。 一.对象树 优点&#xff1a;当父对象被析构时&#xff0c;如果子对象没有被析构&#xff0c;QT的对象树机制会去析构它&…

pandas索引操作、赋值操作、排序以及Series排序和DataFrame排序

一、pandas索引操作 索引操作&#xff0c;使用索引选取序列和切片选择数据&#xff0c;也可以直接使用列名、行名称&#xff0c;或组合使用 直接使用行列索引&#xff1a;行列索引名顺序为先列再行&#xff0c;使用指定行列索引名&#xff0c;不能使用下标loc[行索引名&#…

MySQL数据库表空间回收问题

MySQL数据库表空间回收问题1. MySQL表空间回收2. MySQL表空间设置3. MySQL删除数据流程4. MySQL数据页空洞问题1. MySQL表空间回收 我们经常会发现一个问题&#xff0c;就是把表数据删除以后发现&#xff0c;数据文件大小并没有变化&#xff0c;这就是标题中所说的MySQL数据库…

Numpy数组中的维度和轴

维度究竟是行数还是列数&#xff1f; m维行向量&#xff1a;m维表示一行中有m列&#xff0c;由于是行向量&#xff0c;所以是1行m列n维列向量&#xff1a;n维表示一行中有n行&#xff0c;由于是列向量&#xff0c;所以是n行1列m维向量&#xff1a;看书的习惯了&#xff0c;一般…