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.pswp.cn/web/62475.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62475.shtml
英文地址,請注明出處:http://en.pswp.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…