一、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_PATH
和 LIBRARY_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 保姆級教程(上)- 愛程式設計的大丙