CMake常用命令整理

CMake常用命令整理

轉自:https://zhuanlan.zhihu.com/p/315768216

CMake 是什么我就不用再多說什么了,相信大家都有接觸才會看一篇文章。對于不太熟悉的開發人員可以把這篇文章當個查找手冊。

1.CMake語法

1.1 指定cmake的最小版本

cmake_minimum_required(version 版本號)

例如:

cmake_minimum_required(version 2.8)

1.2 定義工程名稱

#定義工程名稱 
project(項目名稱)

例如:

project(MyTest)

1.3 顯示定義變量

set(var [value])

例如:

# 第一種用法,生成代碼文件列表
#先直接設置SRC_LIST的值
set(SRC_LIST add.h add.cpp)
#然后再在SRC_LIST中追加main.cpp 
set(SRC_LIST ${SRC_LIST} main.cpp)# 第二中用法,設置庫生成目錄或者可執行文件生成目錄
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib/linux) 
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

1.4 設置編譯類型

# 編譯靜態庫
add_library(庫名稱 STATIC 代碼文件名稱) # 編譯動態庫
add_library(庫名稱 SHARED 代碼文件名稱) # 編譯可執行程序
add_executable(可執行程序名 代碼文件名稱)

例如:

# 編譯靜態庫
add_library(add STATIC add.h add.cpp)
add_library(add STATIC ${ADD_SRC} ${ADD_HDR})# 編譯動態庫
add_library(add  SHARED add.h add.cpp) 
add_library(add SHARED  ${ADD_SRC} ${ADD_HDR})# 編譯可執行程序
add_executable(main add.h add.cpp mai.cpp)
add_executable(main ${MAIN_SRC} ${MAIN_HDR})

1.5 指定靜態庫或者動態庫編譯輸出目錄

例如將當前編譯的靜態庫或者動態庫輸出到當前項目文件夾lib子目錄下

set(LIBRARY_OUTPUT_PATH  ${PROJECT_SOURCE_DIR}/lib)

1.6 指定可執行程序編譯輸出目錄

例如將當前可執行程序輸出到當前項目文件夾的bin子目錄下

#設定可執行二進制文件的目錄
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

1.7 設置鏈接庫搜索目錄

例如將鏈接庫搜索目錄設置為當前項目文件夾下lib/linux文件夾

link_directories( ${PROJECT_SOURCE_DIR}/lib/linux)

1.8 設置包含目錄

例如將包含目錄設置為當前項目文件夾下include文件夾

include_directories(${PROJECT_SOURCE_DIR}/include)

1.9 設置宏定義

#預定義宏
add_definitions(-D宏名稱)

例如:

add_definitions(-DWINDOWS)
add_definitions(-DLINUX)

1.10 鏈接靜態庫

link_libraries(靜態庫1靜態庫2靜態庫3...
)

注意,link_libraries中的靜態庫為全路徑,常與1.7 link_directories 搭配使用,例如:

lib1.a lib2.a在目錄${PROJECT_SOURCE_DIR}/lib/linux下,則先設置鏈接目錄,再鏈接相應的庫

#設置鏈接目錄
link_directories( ${PROJECT_SOURCE_DIR}/lib/linux)
link_libraries(lib1.alib2.a
)

1.11 鏈接動態庫

target_link_libraries(所需生成的文件名稱 所需鏈接的動態庫名稱)

例如

target_link_libraries(main dl)

1.12 link_libraries 和 target_link_libraries 區別

在cmake語法中,link_libraries和target_link_libraries是很重要的兩個鏈接庫的方式,雖然寫法上很相似,但是功能上有很大區別:

(1) link_libraries用在add_executable之前,target_link_libraries用在add_executable之后
(2) link_libraries用來鏈接靜態庫,target_link_libraries用來鏈接導入庫,即按照header file + .lib + .dll方式隱式調用動態庫的.lib庫

1.13 file語法

1.13.1 將文件夾所有的類型的文件添加到文件列表

例如將當前文件夾下所有.cpp文件的文件名加入到MAIN_SRC中,將當前文件夾下所有.h加入到MAIN_HDR中。

file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/*.h)

例如將當前文件夾子目錄src文件夾下所有.cpp文件的文件名加入到MAIN_SRC中,將當前文件夾子目錄src文件夾下所有.h加入到MAIN_HDR中。

file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h)

1.13.2 遞歸搜索該文件夾,將文件夾下(包含子目錄)符合類型的文件添加到文件列表

例如將當前文件夾下(包括子目錄下)所有.cpp文件的文件名加入到MAIN_SRC中,所有.h加入到MAIN_HDR中

file(GLOB_RECURSE MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
file(GLOB_RECURSE MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/*.h)

1.14 List操作

常見的List操作包括:

list(LENGTH <list> <output variable>) 
list(GET <list> <element index> [<element index> ...]<output variable>)
list(APPEND <list> [<element> ...])
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)

1.14.1 List移除指定項

例如從MAIN_SRC移除指定項

list(REMOVE_ITEM MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/add.cpp)

1.14.2 將兩個List鏈接起來

# 搜索當前目錄
file(GLOB  MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
file(GLOB  MAIN_HDR ${CMAKE_CURRENT_SOURCE_DIR}/*.h)# 遞歸搜索當前目錄下src子目錄
file(GLOB_RECURSE MAIN_SRC_ELSE  ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB_RECURSE MAIN_HDR_ELSE  ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h)# 將MAIN_SRC_ELSE中的值添加到MAIN_SRC 
# 將MAIN_HDR_ELSE中的值添加到MAIN_HDR 
list(APPEND MAIN_SRC ${MAIN_SRC_ELSE})
list(APPEND MAIN_HDR ${MAIN_HDR_ELSE})

1.15 添加子文件夾

例如

add_subdirectory(src)

該語句會在執行完當前文件夾CMakeLists.txt之后執行src子目錄下的CMakeLists.txt

1.16 message輸出消息機制

輸出正常:

message(STATUS "Enter cmake ${CMAKE_CURRENT_LIST_DIR}")

輸出警告

message(WARNING "Enter cmake ${CMAKE_CURRENT_LIST_DIR}")

輸出錯誤:

message(FATAL_ERROR "Enter cmake ${CMAKE_CURRENT_LIST_DIR}")

1.17 安裝

install 指令用于定義安裝規則,安裝的內容包括二進制可執行文件、動態庫、靜態庫以及文件、目錄、腳本等。

1.17.1 目標文件安裝

例如:

install(TARGETS utilRUNTIME DESTINATION binLIBRARY DESTINATION libARCHIVE DESTINATION lib)

ARCHIVE指靜態庫,LIBRARY指動態庫,RUNTIME指可執行目標二進制,上述示例的意思是:

如果目標util是可執行二進制目標,則安裝到CMAKEINSTALLPREFIX/bin目錄如果目標util是靜態庫,則安裝到安裝到{CMAKE_INSTALL_PREFIX}/bin目錄 如果目標util是靜態庫,則安裝到安裝到CMAKEI?NSTALLP?REFIX/binutil{CMAKE_INSTALL_PREFIX}/lib目錄 如果目標util是動態庫,則安裝到安裝到${CMAKE_INSTALL_PREFIX}/lib目錄

1.17.2 文件夾安裝

install(DIRECTORY include/ DESTINATION include/util)

這個語句的意思是將include/目錄安裝到include/util目錄

1.18 設置編譯選項

設置編譯選項可以通過add_compile_options命令,也可以通過set命令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。 方式1

set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -march=native -O3 -frtti -fpermissive -fexceptions -pthread")

方式2

add_compile_options(-march=native -O3 -fexceptions -pthread -fPIC)

這兩種方式的區別在于:

add_compile_options命令添加的編譯選項是針對所有編譯器的(包括c和c++編譯器),而set命令設置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS變量則是分別只針對c和c++編譯器的。

1.19 預定義變量

1.19.1 基本變量

  • PROJECT_SOURCE_DIR-----------------------------------------我們使用cmake命令后緊跟的目錄,一般是工程的根目錄;
  • PROJECT_BINARY_DIR ------------------------------------------執行cmake命令的目錄,通常是${PROJECT_SOURCE_DIR}/build;
  • CMAKE_INCLUDE_PATH-----------------------------------------系統環境變量,非cmake變量;
  • CMAKE_LIBRARY_PATH------------------------------------------系統環境變量,非cmake變量;
  • CMAKE_CURRENT_SOURCE_DIR---------------------------當前處理的CMakeLists.txt所在的路徑;
  • CMAKE_CURRENT_BINARY_DIR-----------------------------target編譯目錄(使用ADD_SURDIRECTORY(src bin)可以更改此變量的值 ,SET(EXECUTABLE_OUTPUT_PATH <新路徑>)并不會對此變量有影響,只是改變了最終目標文件的存儲路徑);
  • CMAKE_CURRENT_LIST_FILE--------------------------------輸出調用這個變量的CMakeLists.txt的完整路徑;
  • CMAKE_CURRENT_LIST_LINE--------------------------------輸出這個變量所在的行;
  • CMAKE_MODULE_PATH-----------------------------------------定義自己的cmake模塊所在的路徑(這個變量用于定義自己的cmake模塊所在的路徑,如果你的工程比較復雜,有可能自己編寫一些cmake模塊,比如SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令來調用自己的模塊);
  • EXECUTABLE_OUTPUT_PATH------------------------------重新定義目標二進制可執行文件的存放位置;
  • LIBRARY_OUTPUT_PATH--------------------------------------重新定義目標鏈接庫文件的存放位置;
  • PROJECT_NAME-------------------------------------------------返回通過PROJECT指令定義的項目名稱;
  • CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS—用來控制IF ELSE語句的書寫方式;

1.19.2 操作系統變量

  • CMAKE_MAJOR_VERSION-----------------------------cmake主版本號,如3.4.1中的3;
  • CMAKE_MINOR_VERSION-----------------------------cmake次版本號,如3.4.1中的4;
  • CMAKE_PATCH_VERSION-----------------------------cmake補丁等級,如3.4.1中的1;
  • CMAKE_SYSTEM----------------------------------------操作系統名稱,包括版本名,如Linux-2.6.22;
  • CAMKE_SYSTEM_NAME-------------------------------操作系統名稱,不包括版本名,如Linux;
  • CMAKE_SYSTEM_VERSION--------------------------操作系統版本號,如2.6.22;
  • CMAKE_SYSTEM_PROCESSOR--------------------電腦處理器名稱,如i686;
  • UNIX--------------------------------------------------------在所有的類UNIX平臺為TRUE,包括OS X和cygwin,Linux/Unix操作系統;
  • WIN32-----------------------------------------------------在所有的win32平臺為TRUE,包括cygwin,Windows操作系統;
  • APPLE----------------------------------------------------蘋果操作系統;

例如操作系統判斷方式一:

if(WIN32)message(STATUS “This operating system is Windows.”)
elseif(UNIX)message(STATUS “This operating system is Linux.”)
elseif(APPLE)message(STATUS “This operating system is APPLE.”)
endif(WIN32)

操作系統判斷方式二:

if (CMAKE_SYSTEM_NAME MATCHES "Linux")message(STATUS "current platform: Linux ")
elseif (CMAKE_SYSTEM_NAME MATCHES "Windows")message(STATUS "current platform: Windows")
elseif (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")message(STATUS "current platform: FreeBSD")
else ()message(STATUS "other platform: ${CMAKE_SYSTEM_NAME}")
endif (CMAKE_SYSTEM_NAME MATCHES "Linux")

1.19.3 開關選項

  • BUILD_SHARED_LIBS---------------------------------------------控制默認的庫編譯方式。如果未進行設置,使用ADD_LIBRARY時又沒有指定庫類型,默認編譯生成的庫都是靜態庫;
  • CMAKE_C_FLAGS-------------------------------------------------設置C編譯選項,也可以通過指令ADD_DEFINITIONS()添加;
  • CMAKE_CXX_FLAGS----------------------------------------------設置C++編譯選項,也可以通過指令ADD_DEFINITIONS()添加;
  • CMAKE_C_COMPILER--------------------------------------------指定C編譯器;
  • CMAKE_CXX_COMPILER----------------------------------------指定C++編譯器;
  • CMAKE_BUILD_TYPE::build 類型(Debug, Release, …)-CMAKE_BUILD_TYPE=Debug

1.19.4 環境變量

設置環境變量:

set(env{name} value)

調用環境變量:

$env{name}

例如

message(STATUS "$env{name}")

1.19.5 CMAKE_INCLUDE_CURRENT_DIR

自動添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到當前處理 的CMakeLists.txt。 相當于在每個CMakeLists.txt加入:

include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

1.20 條件判斷

1.20.1 邏輯判斷和比較

  • if (expression):expression 不為空時為真,false的值包括(0,N,NO,OFF,FALSE,NOTFOUND);
  • if (not exp):與上面相反;
  • if (var1 AND var2):如果兩個變量都為真時為真;
  • if (var1 OR var2):如果兩個變量有一個為真時為真;
  • if (COMMAND cmd):如果 cmd 確實是命令并可調用為真;
  • if (EXISTS dir) if (EXISTS file):如果目錄或文件存在為真;
  • if (file1 IS_NEWER_THAN file2):當 file1 比 file2 新,或 file1/file2 中有一個不存在時為真,文件名需使用全路徑;
  • if (IS_DIRECTORY dir):當 dir 是目錄時為真;
  • if (DEFINED var):如果變量被定義為真;
  • if (var MATCHES regex):給定的變量或者字符串能夠匹配正則表達式 regex 時為真,此處 var 可以用 var 名,也可以用 ${var};
  • if (string MATCHES regex):給定的字符串能夠匹配正則表達式regex時為真。

1.20.2 數字比較

  • if (variable LESS number):如果variable小于number時為真;
  • if (string LESS number):如果string小于number時為真;
  • if (variable GREATER number):如果variable大于number時為真;
  • if (string GREATER number):如果string大于number時為真;
  • if (variable EQUAL number):如果variable等于number時為真;
  • if (string EQUAL number):如果string等于number時為真。

1.20.3 字母表順序比較

  • if (variable STRLESS string)
  • if (string STRLESS string)
  • if (variable STRGREATER string)
  • if (string STRGREATER string)
  • if (variable STREQUAL string)
  • if (string STREQUAL string)

1.21 循環

1.21.1 foreach

start 表示起始數,stop 表示終止數,step 表示步長

foreach(loop_var RANGE start stop [step])...
endforeach(loop_var)

1.21.2 while

while(condition)...
endwhile()

1.22 自動檢測編譯器是否支持C++11

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

1.23 CMake生成VS解決方案將項目放置在設定文件夾下

例如,我們在工程中引用了許多的第三方開源庫,這些庫的源碼與自己所寫的代碼需要進行區分和隔離,通常情況下會單獨開一個third篩選器存儲這些第三方庫的項目,怎么做?

第一步:

在第三方庫的CMakeLists.txt中cmake_minimum_required(VERSION 2.6)中加上set_property(GLOBAL PROPERTY USE_FOLDERS On)

第二步:在生成編譯目標的語法之后,如:

add_executable(demo demo.cpp) # 生成可執行文件
add_library(common STATIC util.cpp) # 生成靜態庫
add_library(common SHARED util.cpp) # 生成動態庫或共享庫

加入一句

set_target_properties(${第三方庫項目名稱} PROPERTIES FOLDER “目標文件夾名稱”)

2 錯誤解決方案

2.1 Cannot specify link libraries for target “/…/…/lib/linux/libMyDll.a” which

這個問題要將生成執行文件、靜態庫、動態庫的聲明

add_executable(demo demo.cpp) # 生成可執行文件
add_library(common STATIC util.cpp) # 生成靜態庫
add_library(common SHARED util.cpp) # 生成動態庫或共享庫

放在

target_link_libraries()

之前。

2.2 警告:檢測到時鐘錯誤。您的創建可能是不完整的。

在項目根目錄下執行命令:

touch *

更新所有文件時間。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532558.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CVE-2021-41773 CVE-2021-42013 Apache HTTPd最新RCE漏洞復現 目錄穿越漏洞

給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; CVE-2021-41773漏洞描述&#xff1a; Apache HTTPd是Apache基金會開源的一款流行的HTTP服務器。2021年10月8日Apache HTTPd官方發布安全更新&#xff0c;披…

SSRF,以weblogic為案例

給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 復習一下ssrf的原理及危害&#xff0c;并且以weblog的ssrf漏洞為案例 漏洞原理 SSRF(Server-side Request Forge, 服務端請求偽造) 通常用于控制web進而…

C++11 右值引用、移動語義、完美轉發、萬能引用

C11 右值引用、移動語義、完美轉發、引用折疊、萬能引用 轉自&#xff1a;http://c.biancheng.net/ C中的左值和右值 右值引用可以從字面意思上理解&#xff0c;指的是以引用傳遞&#xff08;而非值傳遞&#xff09;的方式使用 C 右值。關于 C 引用&#xff0c;已經在《C引用…

C++11 std::function, std::bind, std::ref, std::cref

C11 std::function, std::bind, std::ref, std::cref 轉自&#xff1a;http://www.jellythink.com/ std::function 看看這段代碼 先來看看下面這兩行代碼&#xff1a; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::function<void(Ev…

Java安全(一) : java類 | 反射

給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 1.java基礎 Java平臺共分為三個主要版本Java SE&#xff08;Java Platform, Standard Edition&#xff0c;Java平臺標準版&#xff09;、Java EE&#xff0…

LeetCode-287 尋找重復數 二分法

LeetCode-287 尋找重復數 二分法 287. 尋找重復數 給定一個包含 n 1 個整數的數組 nums &#xff0c;其數字都在 1 到 n 之間&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一個重復的整數。 假設 nums 只有 一個重復的整數 &#xff0c;找出 這個重復的數 。…

對某公司一次弱口令到存儲型xss挖掘

轉自我的奇安信攻防社區文章:https://forum.butian.net/share/885 免責聲明: 滲透過程為授權測試,所有漏洞均以提交相關平臺,博客目的只為分享挖掘思路和知識傳播** 涉及知識: xss注入及xss注入繞過 挖掘過程: 某次針對某目標信息搜集無意發現某工程公司的項目招標平臺 …

C++11新特性選講 語言部分 侯捷

C11新特性選講 語言部分 侯捷 本課程分為兩個部分&#xff1a;語言的部分和標準庫的部分。只談新特性&#xff0c;并且是選講。 本文為語言部分筆記。 語言 Variadic Templatesmove semanticsautoRange-based for loopInitializer listLambdas… 標準庫 type_traitsunodered…

java安全(二):JDBC|sql注入|預編譯

給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 1 JDBC基礎 JDBC(Java Database Connectivity)是Java提供對數據庫進行連接、操作的標準API。Java自身并不會去實現對數據庫的連接、查詢、更新等操作而是通…

java安全(三)RMI

給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 1.RMI 是什么 RMI(Remote Method Invocation)即Java遠程方法調用&#xff0c;RMI用于構建分布式應用程序&#xff0c;RMI實現了Java程序之間跨JVM的遠程通信…

LeetCode-726 原子的數量 遞歸

LeetCode-726 原子的數量 遞歸 題目鏈接&#xff1a;LeetCode-726 原子的數量 給你一個字符串化學式 formula &#xff0c;返回 每種原子的數量 。 原子總是以一個大寫字母開始&#xff0c;接著跟隨 0 個或任意個小寫字母&#xff0c;表示原子的名字。 如果數量大于 1&#xf…

java安全(四) JNDI

給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 1.JNDI JNDI(Java Naming and Directory Interface)是Java提供的Java 命名和目錄接口。通過調用JNDI的API應用程序可以定位資源和其他程序對象。JNDI是Java…

二叉樹的層序遍歷和前中后序遍歷代碼 迭代/遞歸

前中后序遍歷&#xff08;DFS&#xff09; 首先我們要明確前中后序遍歷的順序&#xff1a; 前序&#xff1a;中左右中序&#xff1a;左中右后序&#xff1a;左右中 前中后序遍歷的遞歸代碼和迭代代碼分別有各自的框架&#xff0c;然后根據遍歷順序調整記錄元素的位置即可。 …

java安全(五)java反序列化

給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 1. 序列化 在調用RMI時,發現接收發送數據都是反序列化數據. 例如JSON和XML等語言,在網絡上傳遞信息,都會用到一些格式化數據,大多數處理方法中&#xff0c…

git merge和rebase的區別與選擇

git merge和rebase的區別與選擇 轉自&#xff1a;https://github.com/geeeeeeeeek/git-recipes/wiki/5.1-%E4%BB%A3%E7%A0%81%E5%90%88%E5%B9%B6%EF%BC%9AMerge%E3%80%81Rebase-%E7%9A%84%E9%80%89%E6%8B%A9#merge BY 童仲毅&#xff08;geeeeeeeeekgithub&#xff09; 這是一篇…

java安全(六)java反序列化2,ysoserial調試

給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; ysoserial 下載地址&#xff1a;https://github.com/angelwhu/ysoserial ysoserial可以讓?戶根據??選擇的利?鏈&#xff0c;?成反序列化利?數據&…

C++面試常見問題一

C面試常見問題一 轉自&#xff1a;https://oldpan.me/archives/c-interview-answer-1 原作者&#xff1a;[oldpan][https://oldpan.me/] 前言 這里收集市面上所有的關于算法和開發崗最容易遇到的關于C方面的問題&#xff0c;問題信息來自互聯網以及牛客網的C面試題目匯總。答題…

java安全(七) 反序列化3 CC利用鏈 TransformedMap版

給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 目錄圖解代碼demo涉及的接口與類&#xff1a;TransformedMapTransformerConstantTransformerInvokerTransformerChainedTransformerdome理解總結&#xff1a…

C++編譯時多態和運行時多態

C編譯時多態和運行時多態 作者&#xff1a;melonstreet 出處&#xff1a;https://www.cnblogs.com/QG-whz/p/5132745.html 本文版權歸作者和博客園共有&#xff0c;歡迎轉載&#xff0c;但未經作者同意必須保留此段聲明&#xff0c;且在文章頁面明顯位置給出原文連接&#xff0…

java安全(八)TransformedMap構造POC

給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 給個關注&#xff1f;寶兒&#xff01; 上一篇構造了一個了commons-collections的demo 【傳送門】 package test.org.vulhub.Ser;import org.apache.commons.collections.Transformer; import org…