Cmake基礎(chǔ)教程(一)
1、基礎(chǔ)信息
cmake_minimum_required(VERSION 3.23)? ? # 所需cmake的最低版本
set(CMAKE_C_STANDARD 99)? ? ? ?# c/cxx語(yǔ)言編譯標(biāo)準(zhǔn)
project(test)? ? ? ? ? # 項(xiàng)目名稱 / 庫(kù)名稱
? ? ? 上述3條信息是CMakeLists中最基礎(chǔ)的,也是必須的3條信息。
2、定義變量
? ? ? 定義變量使用的是set變量,同時(shí)通過(guò)設(shè)置變量,可以達(dá)到簡(jiǎn)化CMake表達(dá)的作用。使用方法:set(變量名 變量值)。例如:
set(APPNAME test)? ? ?? #?設(shè)置可執(zhí)行程序名
set(LIBPATH ${PROJECT_SOURCE_DIR}/lib)? ? ?# 設(shè)置靜態(tài)庫(kù)路徑( ${ } 為變量引用方式)
3、添加并構(gòu)建子目錄
? ? ? add_subdirectory:添加并構(gòu)建子目錄。共有3個(gè)參數(shù):source_dir 為必選參數(shù),該參數(shù)指定一個(gè)子目錄 (絕對(duì)路徑 / 相對(duì)路徑),同時(shí)子目錄下應(yīng)該包含一個(gè) CMakeLists.txt文件和代碼文件用于構(gòu)建。binary_dir 為可選參數(shù),指定輸出文件的存放目錄,默認(rèn)為source_dir。EXCLUDE_FROM_ALL 為可選參數(shù),子目錄下的目標(biāo)不會(huì)被父目錄下的目標(biāo)文件包含進(jìn)去,父目錄的CMakeLists.txt不會(huì)構(gòu)建子目錄的目標(biāo)文件,必須在子目錄下顯式去構(gòu)建。
4、鏈接庫(kù)
? ? ? ?CMake 中鏈接庫(kù)主要有兩個(gè)命令:link_libraries 和 target_link_libraries
? ? ? ?link_libraries 用于鏈接靜態(tài)庫(kù),包含庫(kù)名和路徑兩個(gè)變量,其中,庫(kù)名可以使用全稱(libxx.a),也可以使用簡(jiǎn)稱 (掐頭去尾xx),如果靜態(tài)庫(kù)是第三方的,可以使用 link_directories將靜態(tài)庫(kù)路徑指定出來(lái),避免出現(xiàn)找不到靜態(tài)庫(kù)的情況。
? ? ? target_link_libraries 用于鏈接動(dòng)態(tài)庫(kù),包含目標(biāo)名、庫(kù)訪問(wèn)權(quán)限、庫(kù)名三個(gè)變量。target (目標(biāo)) 可以是一個(gè)源文件、動(dòng)態(tài)庫(kù)、可執(zhí)行文件。權(quán)限有PUBLIC(允許第三方訪問(wèn))、PRIVATE(不允許第三方訪問(wèn))、INTERFACE(不鏈接,只導(dǎo)出符號(hào))三種,默認(rèn)為PUBLIC,
? ? ? 當(dāng)訪問(wèn)權(quán)限為 PUBLIC 時(shí),動(dòng)態(tài)庫(kù)的鏈接具有傳遞性:當(dāng)動(dòng)態(tài)庫(kù) A 同時(shí)鏈接了動(dòng)態(tài)庫(kù) B 和 C,那么在下次只需要鏈接動(dòng)態(tài)庫(kù) A,就可以使用 B 和 C 中的函數(shù)了。
? ? ? link_libraries 置于生成目標(biāo)之前,target_link_libraries 置于生成目標(biāo)之后。
5、包含頭文件目錄
? ? ? 使用 include_directories 包含一個(gè)或多個(gè)頭文件目錄,可以是相對(duì)路徑,也可以是絕對(duì)路徑。
常見(jiàn)的路徑表達(dá)方式:
①??CMAKE_BINARY_DIR / PROJECT_BINARY_DIR:生成的庫(kù)、可執(zhí)行文件等的存放位置,工程頂層目錄(in) / 工程編譯發(fā)生的目錄(out)。
②?CMAKE_SOURCE_DIR / PROJECT_SOURCE_DIR:工程頂層目錄。
③ CMAKE_CURRENT_SOURCE_DIR:當(dāng)前CMakeLists.txt 所在的路徑。
④ CMAKE_CURRENT_BINARY_DIR:當(dāng)前CMakeLists.txt 所在的構(gòu)建目錄的路徑。
⑤ CMAKE_LIBRARY_OUTPUT_DIRECTORY:庫(kù)文件的輸出目錄。
⑥ CMAKE_RUNTIME_OUTPUT_DIRECTORY:可執(zhí)行文件的輸出目錄。