cmake

AngDH發表於2024-06-27

一、CMake概述

CMake是一個跨平臺的專案構建工具。編寫完CMakeLists.txt(注意檔名稱是固定的)後,執行cmake命令,生成Makefile檔案。當然你也可以手動去編寫Makefile檔案,但是編寫的工具量比較大,而且依賴關係也比較多,比較容易出錯。

從專案原始碼到可執行檔案的流程圖:

專案的一般目錄結構:

單獨新建一個空目錄 build 用來儲存cmake命令後的中間檔案,不會把原來的目錄結構搞混亂,而且看起來更整潔。

二、CMakeLists.txt

  • CMakeLists.txt語法

一些內建預定義變數以及含義:

預定義變數 含義
PROJECT_SOURCE_DIR 工程的根目錄
PROJECT_NAME 返回透過project命令定義的專案名
PROJECT_BINARY_DIR 執行cmake命令的目錄,通常是在專案下建立build目錄,並執行命令
CMAKE_CURRENT_SOURCE_DIR 當前處理CMakeLists.txt所在目錄
CMAKE_CURRENT_BINARY_DIR target編譯目錄(即目標檔案輸出目錄)
CMAKE_CURRENT_LIST_DIR CMakeLists.txt的目錄
CMAKE_CURRENT_LIST_LINE 當前所在行(即該變數執行時的所在行)
EXECUTABLE_OUTPUT_PATH 重新定義目標二進位制可執行檔案的存放位置,需要使用者去set
LIBRARY_OUTPUT_PATH 重新定義目標連結庫檔案的存放位置,需要使用者去set

透過一個具體的例子,驗證表格中的內建變數是否正確:

分析上述結果,變數 EXECUTABLE_OUTPUT_PATHLIBRARY_OUTPUT_PATH 為空,內建無效。

  • CMakeLists.txt模板:
# 指定cmake版本
cmake_minimun_required(VERSION x.x)

# 指定專案名稱
project(專案名稱xxxx)

# 新增預處理定義,該功能已被其他命令替換(可選)
add_definitions(編譯選項)

# 為原始檔的新增編譯選項(可選)
add_compile_options(選項1 選項2 選項...)

# 指定標頭檔案目錄,若存在多個用空格隔開
include_directories(目錄1 目錄2 目錄...)

# 搜尋指定目錄下所有原始檔,可以將所有原始檔賦值給一個變數
# 如果不想在add_executable內一個一個寫原始檔的話,aux_source_directory就很有用
aux_source_directory(目錄 變數)

# 設定變數,變數名一般全大寫
set(變數 檔名or路徑or其他)

# 指定原始檔生成庫檔案(預設生成靜態庫)。可將static替換為shared,則生成動態庫
add_library(庫檔名 static 原始檔1 原始檔2 原始檔...)

# 指定庫檔案目錄
link_directories(目錄)

# 指定的原始檔來生成目標可執行檔案
add_executable(目標可執行檔名 原始檔)

# 設定連結庫,即為目標可執行檔案新增需要的庫檔案
target_link_libraries(目標可執行檔名 庫檔名1 庫檔名2 庫檔名...)

# 輸出測試,列印測試字串,一般用於console log(可選)
message(字串1 字串2或變數 字串...)

# 指定安裝目錄,一般需要先指定按照目標字首,例如:/usr,執行make install後,可執行檔案安裝到:/usr/bin目錄下
set(CMAKE_INSTALL_PREFIX /usr)
install(TARGETS ${PROJECT_NAME} DESTINATION bin)

# 查詢目標依賴包
find_package()

二、參考地址

Cmake知識----編寫CMakeLists.txt檔案編譯C/C++程式

CMakeLists.txt編寫常用命令 - 星星,風,陽光 - 部落格園 (cnblogs.com)

CMake 保姆級教程(上)- 愛程式設計的大丙