cmake_minimum_required (VERSION 3.10)?? 指定最小版本
project(XXXX)?????? 指定項目名字???????????????
---------------
set(MAIN_EXEC_NAME dwarf_parser)?? 定義變量
${ MAIN_EXEC_NAME }?? 變量取值
set(CMAKE_CXX_STANDARD 14) 指定c++14標準,還有11、17、20等標準
set(EXECUTABLE_OUTPUT_PATH? ../bin)? 指定輸出的路徑(絕對路徑)
aux_source_directory(路徑 變量名)? 搜索路徑下的源文件,存儲到變量,${ }取值??????????????
或者
file(GLOB /GLOB_RECURSE ?SRCS ?"path/*.cc")?? 搜索路徑下的cc文件存儲到變量
file的參數:GLOB 搜索當前目錄;GLOB_RECURSE 遞歸搜索當前目錄和子目錄
include_directories(include)? 指定源文件需要的頭文件在的目錄
--------------------------
set(LIBRARY_OUTPUT_PATH? ../home)? 指定庫文件生成到的路徑
add_library(庫名字 STATIC/SHARED 源文件) 制作靜態庫/動態庫,名字為lib+庫名字+.a/so
target_link_libraries(可執行程序名? 動態庫名字)? 程序鏈接動態庫/靜態庫
link_libraries(靜態庫名字libxxx.a/xxx)? 鏈接靜態庫
link_directories( path )? 若靜態庫/動態庫不是系統的,需要將路徑指定出來
add_executable(可執行程序名? 源文件名)?? 生成可執行程序
動態庫權限有PUBLIC 庫傳遞多次/ PRIVATE 庫傳遞一次/ INTERFACE 不傳遞,只鏈接庫里
--------------------------
message(“xxx”)? 顯示消息
前綴[無]代表重要消息,STATUS 非重要信息,FATAL_ERROR 錯誤并終值所有處理
#ifdef DEBUG
? Xxx
#endif
程序測試時候,加入宏定義控制代碼是否生效
gcc test.c -DDEBUG? 或者 add_definitions(-D宏名字)? 可以編譯時定義宏
-------------------------
Cmake的嵌套,在根節點的cmake里定義好變量并且添加子目錄,子節點直接使用。
子節點先添加源文件和頭文件,鏈接靜態庫,然后生成可執行文件。
靜態庫直接打包到可執行程序里,占內存,但方便;動態庫節省內存,但需要和可執行程序一起發布。