Cmake+基础命令

一、版本要求:

检查 cmake 版本号的最低要求,不满足条件时报错。

cmake_minimum_required(VERSION <version>)

参数:

  • version:最低要求的版本号
    例子:
# 最低要求安装3.21版本的cmake
cmake_minimum_required(VERSION 3.21)

二、工程名称:

设置项目的工程名称,此名称设置后可以使用 CMAKE_PROJECT_NAME 宏直接获取

project(<name> [language])

参数:

  • name:项目名称
  • language:指定项目的编程语言,例如:C、CXX、ASM
    例子:
# 指定项目使用 C、C++或者是汇编
set(BUILD_TARGET main)
project(${BUILD_TARGET} C CXX ASM)

三、添加构建目录

增加 cmake 子目录,用于建立 Cmakelists.txt 文件层级的依赖

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL] [SYSTEM])

参数

  • source_dir:该参数指定一个子目录,子目录下应该包含 CMakeLists.txt 文件和代码文件
  • binary_dir:指定输出目录,如果没有指定,默认生成到 source_dir 目录
    例子
# 指定 cmake 子目录
add_subdirectory(deps/)

四、添加宏定义(-Dxxx)

为编译目标或者所有目标增加宏定义

# 为当前路径的所有源文件和target增加编译定义
# 方式1
add_definitions(-DFOO -DBAR ...)
# 方式2
add_compile_definitions(<definition> ...)# 为指定的target指定宏定义
target_compile_definitions(<target><INTERFACE|PUBLIC|PRIVATE> [definition1...][<INTERFACE|PUBLIC|PRIVATE> [definition2...] ...])

参数

  • target:宏定义所属的目标,可以有 add_executable() 或 add_library() 定义
  • definition:指定的宏定义,不需要带 -D
    例子
add_definitions(-DFOO=1 -DBAR)add_compile_definitions(FOO=1 BAR)target_compile_definitions(target PRIVATE FOO=1 PUBLIC BAR)

target_compile_definitions 可以指定目标进行宏定义,例如代码中有宏进行隔离的部分,可以通过为 target 指定不同的宏,配合 add_library() 来生成不同的库文件。

五、生成可执行文件

增加一个目标用于生成可执行文件

add_executable(<target> [EXCLUDE_FROM_ALL] [source1] [source2 ...])

参数

  • target:可执行目标的名称
  • EXCLUDE_FROM_ALL:当使用这个选项时指定的文件将不参与构建
  • source:源文件列表,也可以通过 target_sources() 为可执行目标文件添加源文件,要求是在调用 target_sources 之前,可执行目标文件必须已经通过 add_executable() 或 add_library() 定义了。
    例子
# 直接指定源文件
add_executable(main main.c)# 通过 target_sources 追加源文件
add_executable(main)
target_sources(main PUBLIC main.c other.c)

六、生成库文件

普通库生成

生成普通的静态库或者是动态库文件

add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[<source>...])

参数

  • name:库的名称
  • STATIC|SHARED|MOUDLE:库的类型
  • source:构建库的文件,也可以通过 target_sources() 继续为可执行目标文件添加源文件
    例子
# 生成静态库
add_library(main STATIC ${libs_src})# 生成动态库
add_library(list SHARED ${libs_src})

对象库生成

只编译,但是不会进行库的打包

add_library(<name> OBJECT [<source>...])

只编译 source 列表的文件,但不将生成的目标文件打包为库,而是在其他 add_library() 或者 add_executable() 生成目标的时候,可以使用形如$<TARGET_OBJECTS:objlib>的表达式将对象库作为源引入。
参数

  • name:库的名称
  • OBJECT:库的类型
  • source:构建库的文件,也可以通过target_sources()继续为可执行目标文件添加源文件
    例子
add_library(list OBJECT ./list.c)
add_library(mylist $<TARGET_OBJECTS:list>)

七、指定头文件目录(gcc -I):

为所有目标或者指定的目标增加头文件搜索路径

# 为所有target 添加头文件路径
include_directories([AFTER|BEFORE] dir1 [dir2 ...])# 为指定目标添加头文件路径
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]<INTERFACE|PUBLIC|PRIVATE> [dir1...][<INTERFACE|PUBLIC|PRIVATE> [dir1...] ...])

include_directories 会为当前 CMakeLists.txt 的所有目标,以及之后添加的所有子目录的目标添加头文件搜索路径。
参数

  • AFTER、BEFORE:指定的路径添加到搜索列表前面还是后面,默认 AFTER;
  • dir:指定要搜索的头文件目录,目录是当前源码路径(当前 CMakeLists.txt)的相对路径;
  • target: 要添加头文件的目标,target由 add_library 和 add_executable 添加;
  • dir 指定的源文件或者头文件,地址是相对于 CMAKE_CURRENT_SOURCE_DIR 的地址;
    例子
include_directories(${CMAKE_SOURCE_DIR}/include)target_include_directories(${target} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

八、收集源文件:

收集指定目录下的源文件

aux_source_directory(<dir> <variable>)

参数

  • dir:指定的目录;
  • variable:把源文件列表保存到指定的变量中;
    例子
aux_source_directory(../src LOCAL_SRC)
# 排除 src 路径下的 test.c 文件
list(REMOVE_ITEM LOCAL_SRC "../src/test.c")# 使用 file 收集源文件
file(GLOB LOCAL_SRC src/*.c)

九、指定库文件目录(gcc -L):

为所有目标或指定目标添加库文件搜索路径

link_directories(dir1 dir2 ...)# 为指定目标添加库文件搜索目录
target_link_directories(<target> [BEFORE]<INTERFACE|PUBLIC|PRIVATE> [items1...][<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

参数

  • AFTER、BEFORE:指定的路径添加到搜索列表前面还是后面,默认AFTER;
  • dir:指定要搜索的库文件目录,目录是当前源码路径(当前 CMakeLists.txt)的相对路径;
  • target: 要添加头文件的目标,target 由 add_library() 和 add_executable() 添加;
  • items 指定的源文件或者头文件,地址是相对于 CMAKE_CURRENT_SOURCE_DIR 的地址;
    例子
link_directories(${CMAKE_SOURCE_DIR}/lib)target_link_directories(${target} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/lib)

如果在使用 target_link_libraries 时库已经包含了绝对路径时也可以不需要指定库的搜索路径。

十、指定库文件(gcc -l)

为目标添加链接是需要的库文件

target_link_libraries(<target> ... <item>... ...) # link_libraries 已经弃用

参数

  • target: 要增加的目标,必须先通过 或 指定;
  • item:依赖的的库名称;
    例子
# 三种写法功能相同,在使用前必须通过命令指定 target
target_link_libraries(main -Wl,--start-group eng mx -Wl,--end-group)target_link_libraries(main -Wl,--start-group -leng -lmx -Wl,--end-group)target_link_libraries(main -Wl,--start-group libeng.so libmx.so -Wl,--end-group)

十一、增加编译选项:

增加编译选项

add_compile_options(<option> ...)

参数

  • option:编译选项
    例子
# 增加针对所有编译器的选项
add_compile_options(-g -Os
-Wall
-Wno-unused-variable
-fno-strict-aliasing
-ffunction-sections -fdata-sections
)# 增加针对指定编译器的选项
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-exceptions -fno-rtti -fno-threadsafe-statics")

add_compile_options 是为所有编译器增加链接选项,但是有些选项需要区分编译器,例如 c 和 c++ 中特有的选项,则需要使用set 设置指定的宏。

十二、增加链接选项:

增加链接选项

add_link_options(<option> ...)

参数

  • option:链接选项
    例子
add_link_options(-Wl,-Map=${PROJECT_NAME}.map
-Wl,--gc-sections
)

十三、定义全局属性:

有些时候需要在 cmake 多个层级之间传递内容,则可以使用自定义的全局属性

# 定义 MY_LIBRARIES 用于收集所有的打包后库文件
function(add_globle_libraries)
get_property(TIDE_LIBRARIES GLOBAL PROPERTY MY_LIBRARIES)
set_property(GLOBAL PROPERTY MY_LIBRARIES ${MY_LIBRARIES} ${ARGN})
endfunction()# 获取 MY_LIBRARIES 中库文件列表
get_property(MY_LIBRARIES GLOBAL PROPERTY MY_LIBRARIES)

十四、执行命令:

用来在 cmake 中执行命令或是调用其他程序

execute_process(COMMAND <cmd1> [<arguments>]
[COMMAND <cmd2> [<arguments>]]...
[WORKING_DIRECTORY <directory>]
[TIMEOUT <seconds>]
[RESULT_VARIABLE <variable>]
[RESULTS_VARIABLE <variable>]
[OUTPUT_VARIABLE <variable>]
[ERROR_VARIABLE <variable>]
[INPUT_FILE <file>]
[OUTPUT_FILE <file>]
[ERROR_FILE <file>]
[OUTPUT_QUIET]
[ERROR_QUIET]
[COMMAND_ECHO <where>]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE]
[ENCODING <name>]
[ECHO_OUTPUT_VARIABLE]
[ECHO_ERROR_VARIABLE]
[COMMAND_ERROR_IS_FATAL <ANY|LAST>])

命令 COMMAND 会并行执行,每个子进程的标准输出映射到下一个进程的标准输入上,所有进程共用 standard error 管道。
参数

  • COMMAND: 子进程的命令行,直接使用操作系统api执行
  • WORKING_DIRECTORY:在指定的目录下执行 COMMAND 命令
  • TIMEOUT:超时时间
  • RESULT_VARIABLE:最后一个子进程的返回值(正常是0,异常是其他整数)
  • OUTPUT_VARIABLE:对应于standard output的内容
  • ERROR_VARIABLE:对应于standard error的内容
  • OUTPUT_STRIP_TRAILING_WHITESPACE/ERROR_STRIP_TRAILING_WHITESPACE:删除空白字符
    例子
# 执行 echo 命令
execute_process(COMMAND echo "hello world"WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}TIMEOUT 3RESULT_VARIABLE result_varOUTPUT_VARIABLE output_varERROR_VARIABLE error_varOUTPUT_STRIP_TRAILING_WHITESPACEERROR_STRIP_TRAILING_WHITESPACE)
message(STATUS "result: ${result_var}")
message(STATUS "output: ${output_var}")
message(STATUS "error: ${error_var}")# 获取当前环境下 gcc 中 libgcc.a 的完整路径
execute_process(COMMAND gcc --print-file-name libgcc.aOUTPUT_VARIABLE TIDE_LIBGCC_FILEOUTPUT_STRIP_TRAILING_WHITESPACE)

十五、定制化构建规则

add_custom_target:
  添加一个伪目标(没有输出的目标),主要是通过依赖中的命令和依赖的依赖来进行相关动作,一般配合 add_custom_command 使用,通过 add_custom_command 的 OUTPUT 来作为 DEPENDS 依赖。

add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[JOB_POOL job_pool]
[VERBATIM] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS]
[SOURCES src1 [src2...]])

参数

  • Name:target 目标名称
  • ALL:说明该目标需要添加到默认目标的构建中,所以命令每次都会被执行
  • COMMAND:构建时执行的命令
  • COMMENT:注释信息,会在命令执行前打印出来
  • DEPENDS:通常以同一 CMakeLists.txt 文件中的 add_custom_command() 命令生成的文件作为依赖
    例子
# 例子中通过 add_custom_target 设置一个没有输出的目标,通过目标的依赖来创建一个名称为 log.txt 的文件set(TEST_FILE "log.txt")
# 产生 FILE_TEST 文件,FILE_TEST 文件通过命令 copy 产生,并依赖 CMAKE_CURRENT_LIST_FILE
add_custom_command(OUTPUT ${TEST_FILE}COMMAND echo "Generating log.txt file..."COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_FILE} ${TEST_FILE}DEPENDS ${CMAKE_CURRENT_LIST_FILE}COMMENT "This is a test")# 创建一个伪目标 Test,这个伪目标依赖 TEST_FILE 文件
add_custom_target(TestALLCOMMAND echo "execute a custom target..."DEPENDS ${TEST_FILE})

add_custom_target 的最大作用就是通过一个虚拟的 target 形成依赖关系,依赖关系可以无限,例如:依赖1–>依赖2–>依赖3,从而形成一系列的串行动作,来产生输出。

add_custom_command:
用法一:生成文件
  增加一个定制化的命令用来产生一个输出,这个输出一般被 add_custom_target 作为 DEPENDS 依赖。

add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1[ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS[depends...]]
[IMPLICIT_DEPENDS<lang1> depend1 ...]
[WORKING_DIRECTORYdir]
[COMMENT comment] [VERBATIM] [APPEND])

参数

  • OUTPUT:指定输出(一般是一个中间文件)
  • COMMAND:产生输出时执行的命令
  • COMMENT:注释信息,会在命令执行前打印出来
  • DEPENDS:命令执行的依赖,依赖发生修改就会执行 COMMAND 产生新的 OUTPUT。依赖可以是某个 target(通过add_library/add_executable/add_custom_target创建的)或者直接是某个文件
    例子
# 例子中通过 add_custom_target 设置一个没有输出的目标,通过目标的依赖来创建一个名称为 log.txt 的文件set(TEST_FILE "log.txt")
# 产生 FILE_TEST 文件,FILE_TEST 文件通过命令 copy 产生,并依赖 CMAKE_CURRENT_LIST_FILE
add_custom_command(OUTPUT ${TEST_FILE}COMMAND echo "Generating log.txt file..."COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_FILE} ${TEST_FILE}DEPENDS ${CMAKE_CURRENT_LIST_FILE}COMMENT "This is a test")# 创建一个伪目标 Test,这个伪目标依赖 TEST_FILE 文件
add_custom_target(TestALLCOMMAND echo "execute a custom target..."DEPENDS ${TEST_FILE})

注意
  add_custom_command 的 makefile 的表现形式如下,就是检查依赖,在依赖变动的情况下通过命令生成输出。

OUTPUT: MAIN_DEPENDENCY DEPENDSCOMMAND

add_custom_command(OUTPUT xxx) 不能单独使用,否则命令将不会被执行,所以他所产生的 OUTPUT 输出必须要被作为其他目标的依赖,这也是为什么必须要和 add_custom_target 配合的原因。

用法二:添加命令
  为某个目标如库或可执行程序添加一个命令,并可以指明命令执行的时机,如果该目标已经构建,命令将不会执行。

add_custom_command(TARGET target
PRE_BUILD | PRE_LINK| POST_BUILD
COMMAND command1[ARGS] [args1...]
[COMMAND command2[ARGS] [args2...] ...]
[WORKING_DIRECTORYdir]
[COMMENT comment][VERBATIM])

参数

  • TARGET:指定要为那个 target 创建命令
  • PRE_BUILD:在所有规则执行前执行
  • PRE_LINK:在源文件编译后且链接前执行
  • POST_BUILD:在所有规则执行后执行命令
  • COMMAND:需要执行的命令
  • COMMENT:注释信息,会在命令执行前打印出来
    例子
set(TEST_FILE "log.txt")# 作为依赖产生文件
add_custom_command(OUTPUT ${TEST_FILE}
COMMAND echo "Generating log.txt file..."
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_FILE} ${TEST_FILE}
DEPENDS ${CMAKE_CURRENT_LIST_FILE}
COMMENT "This is a test"
)# 创建一个没有输出的目标,注意是通过依赖来执行命令
add_custom_target(Test1
ALL
COMMAND pwd
DEPENDS ${TEST_FILE})# 为目标 Test1 增加一条定制化命令
add_custom_command(TARGET Test1
PRE_BUILD
COMMAND echo "executing a fake command"
COMMENT "This command will be executed before building target Test1"
)

十六、设置库输出路径:

# 设置静态库文件目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)# 动态库文件目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)# 可执行文件目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

十七、文件操作:

file(CMD <filename> [...])

https://cmake.org/cmake/help/latest/command/file.html
参数

  • CMD:文件操作命令,包括读、写、增、删、改等,具体参数见链接下的具体 CMD
  • filename:文件名称
    例子
# 拷贝文件
file(COPY_FILE ./test.txt ./test2.txt)

十八、程序查找

find_program (<VAR>name | NAMES name1 [name2 ...] [NAMES_PER_DIR][HINTS [path | ENV var]... ][PATHS [path | ENV var]... ][REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)][PATH_SUFFIXES suffix1 [suffix2 ...]][DOC "cache documentation string"][NO_CACHE][REQUIRED][NO_DEFAULT_PATH][NO_PACKAGE_ROOT_PATH][NO_CMAKE_PATH][NO_CMAKE_ENVIRONMENT_PATH][NO_SYSTEM_ENVIRONMENT_PATH][NO_CMAKE_SYSTEM_PATH][NO_CMAKE_INSTALL_PREFIX][CMAKE_FIND_ROOT_PATH_BOTH |ONLY_CMAKE_FIND_ROOT_PATH |NO_CMAKE_FIND_ROOT_PATH]
)

参数

  • VAR:寻找程序或者变量后结果的缓存
  • NAMES:除了name 以外可以指定更多可能得名称
  • HINTS:除了系统路径外,还需要搜索的路径,先搜索指定路径,后搜索系统路径
  • PATHS:除了系统路径外,还需要搜索的路径,先搜索系统路径,后搜索指定路径
  • REGISTRY_VIEW:指定必须要查询的注册表视图,仅用于windows,例如查找安装的一些软件路径
  • REQUIRED:搜索不到会报错并停止搜索
  • NO_DEFAULT_PATH:默认搜索路径将失效,只会搜索PATHS和HINTS指定的路径
    例子
# 搜索指定前缀的 gcc 程序
find_program(TIDE_C_COMPILER   ${CROSS_COMPILE}gcc     REQUIRED)# 搜索window下cmd 控制台程序
find_program(MY_PROGRAM cmd NAMES cmd.exe)

十九、目标属性设置:

set_target_properties(target1 target2 ...PROPERTIES prop1 value1prop2 value2 ...)

参数:

  • target:需要设置属性的目标,在使用前 target 需要使用 add_library()或者 add_executable() 指定atrget。
  • PROPERTIES:属性标识,后面紧接着时属性和属性值
  • prop:属性标识
  • value:属性值
    例子:
# 对目标设置宏定义
set(BUILD_FLAGS "-DBUILD_DLL" )
set_target_properties(main PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS})# 更改目标输出名称
add_library (libiwasm SHARED ${WAMR_RUNTIME_LIB_SOURCE})
set_target_properties (libiwasm PROPERTIES OUTPUT_NAME iwasm)# 设置目标文件输出目录
set_target_properties(iwasm PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/build/lib
)# 设置 include 目录搜索目录
set_target_properties(iwasm PROPERTIES INCLUDE_DIRECTORIES ${LIB_RATS_DIR})# 设置debug模式目标后缀
set_target_properties(iwasm PROPERTIES DEBUG_POSTFIX dbg)# 设置生成地址无关码的可执行目标或者库目标
set_target_properties(wamrc PROPERTIES POSITION_INDEPENDENT_CODE ON)# 自定义目标属性
set_target_properties(<target> PROPERTIES <custom_property_name> <value>)

二十、获取目标属性

get_target_property(<variable> <target><property>)

参数:

  • variable:存储属性的变量
  • target:获取属性的目标
  • property:属性标识
    例子:
# 获取 debug 目标文件的后缀名
get_target_property(postfix iwasm DEBUG_POSTFIX)

🌀路西法 的个人博客拥有更多美文等你来读

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

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

相关文章

Java——容器(单例集合)(上)

一 容器介绍 容器&#xff0c;是用来容纳物体、管理物体。生活中,我们会用到各种各样的容器。如锅碗瓢盆、箱子和包等 程序中的“容器”也有类似的功能&#xff0c;用来容纳和管理数据。比如&#xff0c;如下新闻网站的新闻列表、教育网站的课程列表就是用“容器”来管理 视频…

word poi-tl 表格功能增强,实现表格功能垂直合并

目录 问题解决问题poi-tl介绍 功能实现引入依赖模版代码效果图 附加&#xff08;插件实现&#xff09;MergeColumnData 对象MergeGroupData 类ServerMergeTableData 数据信息ServerMergeTablePolicy 合并插件 问题 由于在开发功能需求中&#xff0c;word文档需要垂直合并表格&…

OpenCV相机标定与3D重建(11)机器人世界手眼标定函数calibrateRobotWorldHandEye()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算机器人世界/手眼标定&#xff1a; w T b _{}^{w}\textrm{T}_b w​Tb​ 和 c T g _{}^{c}\textrm{T}_g c​Tg​。 cv::calibrateRobotWorldHa…

GPT系列模型简要概述

GPT-1&#xff1a;&#xff08;0.117B参数量&#xff0c;0.8B words预训练数据) 动机&#xff1a; 在RNN和Transformer之间&#xff0c;选择了后者。 和《All your need is Attention》翻译模型的Encoder-Decoder架构相比&#xff0c;只保留Decoder&#xff0c;因此去掉了Cross…

汽车升级到底应不应该设置“可取消“功能

最近&#xff0c;汽车OTA&#xff08;Over-the-Air&#xff09;升级频频成为车主讨论的热点。有些车主反映&#xff0c;一些升级增加了实用功能&#xff0c;而另一些却让体验变得复杂甚至带来不便。于是&#xff0c;大家不禁发问&#xff1a;汽车升级功能究竟应不应该允许“可取…

单片机 PCB 设计要点

一、引言 单片机作为现代科技的重要组成部分&#xff0c;其 PCB 设计至关重要。本文将详细介绍单片机 PCB 设计的要点和流程&#xff0c;帮助读者更好地掌握这一关键技术。 在电子世界的浩瀚星海中&#xff0c;单片机无疑是现代科技中一颗闪烁的明珠。作为掌握嵌入式系统的基…

Django+Apscheduler 开发定时任务模块【六】

目录 回顾 前五个文章讲述了django-autojob的部分代码和执行逻辑 【DjangoApscheduler 开发定时任务模块】【一】 【DjangoApscheduler 开发定时任务模块】【二】 【DjangoApscheduler 开发定时任务模块】【三】 【DjangoApscheduler 开发定时任务模块】【四】 【DjangoApsch…

Ubuntu中配置交叉编译工具的三条命令的详细研究

关于该把下面的三条交叉编译配置语句加到哪里&#xff0c;详情见 https://blog.csdn.net/wenhao_ir/article/details/144326545 的第2点。 现在试解释下面三条交叉编译配置语句&#xff1a; export ARCHarm export CROSS_COMPILEarm-buildroot-linux-gnueabihf- export PATH$…

wlanapi.dll丢失怎么办?有没有什么靠谱的修复wlanapi.dll方法

在遇到各种系统文件错误当中&#xff0c;其中之一就是“wlanapi.dll文件丢失”的问题。这种问题通常发生在Windows操作系统上&#xff0c;特别是当系统试图执行与无线网络相关的任务时。wlanapi.dll是一个重要的系统文件&#xff0c;它负责处理Windows无线网络服务的许多功能。…

利用ipmi工具设置ip、用户等设置

#打开交互模式 ipmitool -I open shell #切换管理端口为lom1&#xff0c;即共享em1/eth0 delloem lan set shared with lom1 #设置ip、mask、gateway lan set 1 ipaddr 10.0.0.250 lan set 1 netmask 10.0.0.250 lan set 1 defgw ipaddr 10.0.0.250 #查看用户名 user list 1 …

Python之因子分析详细步骤

1.数学原理 1.1数学模型 1.2正交因子模型假设 注意&#xff1a;下面的推导都是基于这一假设。因此&#xff0c;这里的模型都是属于正交因子模型。 1.3正交因子模型的协方差结构 1.4各类方差贡献的介绍 在1.3正交因子模型的协方差结构中&#xff0c;我们介绍了“方差贡献”&…

unity3d—demo(2d人物左右移动发射子弹)

目录 人物代码示例&#xff1a; 子弹代码示例&#xff1a; 总结上面代码&#xff1a; 注意点&#xff1a; 人物代码示例&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerTiao : MonoBehaviour {public f…

linux之vim

一、模式转换命令 vim主要有三种模式&#xff1a;命令模式&#xff08;Normal Mode&#xff09;、输入模式&#xff08;Insert Mode&#xff09;和底线命令模式&#xff08;Command-Line Mode&#xff09;。 从命令模式切换到输入模式&#xff1a;i&#xff1a;在当前光标所在…

显存和GPU之间的通信;GPUDirect P2P,NVLink,NCCL;聚合通信和点对点通信

目录 显存和GPU之间的分配 显存和GPU之间的通信 原语是什么,简单举例说明 GPUDirect P2P,NVLink,NCCL的全称及解释 聚合通信和点对点通信 聚合通信(Collective Communication) 点对点通信(Point-to-Point Communication) 为什么使用GPUDirect P2P,NVLink,NCCL…

Mysql 的 B+ 树是否包含行数据?

在 MySQL 中&#xff0c;是否在 B树 的叶子节点上存储完整的行数据&#xff0c;取决于使用的 存储引擎 和 索引类型&#xff1a; 聚簇索引 (Clustered Index) 叶子节点包含完整的行数据。 适用场景&#xff1a;MySQL InnoDB 存储引擎的主键索引&#xff08;或聚簇索引&#xf…

【记录】用JUnit 4的@Test注解时报错java.lang.NullPointerException的原因与解决方法

项目场景&#xff1a; 在练习黑马点评的逻辑过期解决缓存击穿时&#xff0c;编写了一个预热缓存数据的单元测试 SpringBootTest public class HmDianPingApplicationTests {Resourceprivate ShopServiceImpl shopService;Testpublic void testSaveShop() throws InterruptedE…

echarts使用整理

4、条形分区统计 <div ref"chartsVal1" class"chartsline-div"></div> const chartsVal1 ref(null); const chartsVal1Title ref(运行时间统计);drewCharts2(chartsVal1, chartsVal1Title.value);function drewCharts2(id, title) {const m…

【八股】HTTP

浏览器输入URL之后发生的过程 浏览器解析URL中的协议&#xff0c;主机&#xff0c;端口&#xff0c;路径参数等DNS域名解析得到对应的IP地址通过IP和PORT对服务器发送TCP三次握手建立连接浏览器发送请求服务器接受请求&#xff0c;处理并响应浏览器得到HTTP响应&#xff0c;对…

torch.optim.lr_scheduler.ReduceLROnPlateau

torch.optim.lr_scheduler.ReduceLROnPlateau 是 PyTorch 中的一种学习率调度器&#xff0c;主要用于在模型训练过程中根据某些指标&#xff08;如验证损失&#xff09;动态调整学习率。它是一种基于性能指标动态调整学习率的策略&#xff0c;而不是预定义的固定时间调整。 主要…

ubuntu下的chattts 学习6:音色固定的学习

魔搭社区 该区提供了随机种子级音乐的试听与下载。 spk torch.load(<PT-FILE-PATH>) params_infer_code {spk_emb: spk, } 略 测试过程&#xff1a; 1.先建一个文件夹&#xff1a;然后从上面的网站上下载了两个。放在里面测试 2 2.测试代码 import ChatTTS impo…