1. 程式人生 > >CMake簡易入門

CMake簡易入門

使用CMake編譯

CMake工具用於生成Makefile檔案。使用者通過編寫CMakeLists.txt檔案,描述構建過程(編譯、連線、測試、打包),之後通過解析該檔案,生成目標平臺的Makefile檔案,做到"Write once, run everywhere"。

   

使用CMake的方法很簡單:

cmake <projectPath>

確保projectPath目錄下,有CMakeLists.txt檔案。該檔案當然是使用者來編寫,所以重點是編寫CMakeLists.txt,語法可以參考《

CMake 入門實戰》,或者官方入門文件:

https://cmake.org/cmake-tutorial/

PS:在Windows下使用時,需要使用VS自帶的命令列,不然會找不到cl工具的錯誤。

   

成功執行cmake命令後,目錄下會生成Makefile檔案,不同編譯平臺生成的檔案不同,編譯工具也不同。

  • 如果是構建平臺是MinGW,會什麼makefile檔案,使用mingw32-make構建。
  • 如果構建平臺是VS系列,會生成vcxproj檔案,可以使用msbuild工具構建。
  • 如果構造平臺是NMake,可以使用nmake構建。

可以使用以下命令編譯:

cmake --build <CMakeCachePath> --target <ProjectName>

CMakeCachePath是指CMakeCache.txt(或CMakeFiles資料夾)所在的路徑。

   

可以使用以下命令清理編譯結果:

cmake --build <CMakeCachePath> --target clean

   

如果CMakeLists.txt檔案有修改,再次執行cmake命令,會更新Makefile檔案。

   

關於編譯平臺的選擇

可以使用以下命令,檢視cmake支援的構建工具:

cmake -G

   

   

在生成Makefile時,指定構建工具:

cmake -G "<generator>" <projectPath>

generator可以是等號左邊的名字。

   

例如,在Windows下,預設生成vcxproj檔案(cmake 3.13.0-rc3 + VS2017),如果希望使用nmake構建,可以使用以下命令:

cmake -G "NMake Makefiles" <projectPath>

   

關於清理生存檔案

存在一個問題,沒找到較好的解決方案,如何清理CMake產生的檔案?

A:可以使用"-B"引數指定生成目錄,這樣CMake生成的檔案都會集中在這個檔案,例如:

cmake -B <buildPath> .

之後在編譯操作,均要在buildPath資料夾下執行。

特別的,還可以使用"-S"引數指定原始碼所在的資料夾,原始碼資料夾必須包含CMakeLists.txt。

詳情可以參考:

https://cmake.org/cmake/help/v3.13/manual/cmake.1.html

CMakeLists.txt編寫入門

可以使用Qt Creator新建一個CMake工程,每次修改後CmakeLists.txt檔案後,可以在"General Messages"視窗,檢視輸出內容。

   

基礎

CMakeLists.txt由命令構造成,每條命令佔一行,換行符結尾,命令的格式如下:

commandName(arg1 arg2 …)

命令名不區分大小寫引數間使用空格分隔

   

在CMakeLists.txt中,字元串同C語言中一樣,使用雙引號包含

   

輸出

使用message()命令,輸出資訊,至少接受兩個引數:

第一個引數指定資訊的等級,為空的時候為重要資訊,通常使用"STATUS"作為引數,代表該資訊為普通說明資訊。

第二個引數為一個字串,可以跟隨多個字串。

例如:

message(STATUS "Hello World")

   

變數

使用set()命令,自定義變數,至少接受兩個引數,第一個引數為變數名,第二個引數為變數的值。引數如果多於2個,那麼該變數為一個集合。

特別的,可以使用以下命令設定系統環境變數:

set(ENV{<variable>} <value>...)

   

訪問變數的格式如下:

${<variable>}

訪問系統環境變數需要以下格式:

$ENV{<variable>}

   

CMake內建了許多變數,可以參考:

https://cmake.org/cmake/help/v3.13/manual/cmake-variables.7.html

   

常用的有:

PROJECT_NAME

專案名

PROJECT_BINARY_DIR

專案編譯輸出路徑,呼叫cmake命令時,使用"-B"引數指定,預設為CMakeLists.txt所在的檔案。

PROJECT_SOURCE_DIR

專案原始碼路徑,呼叫cmake命令時,使用"-S"引數指定,預設為CMakeLists.txt所在的檔案。

CMAKE_DEBUG_POSTFIX

CMAKE_RELEASE_POSTFIX

Debug/Release版的動態庫字尾

CMAKE_BUILD_TYPE

編譯型別(Debug、Release),該變數預設為空值

內建變數可以在呼叫cmake命令時,使用"-D"引數設定:

   

例子

推薦使用以下命令編譯,這樣生成的檔案集中在build資料夾下,不會汙染原始碼資料夾。

#cd進入CMakeLists.txt所在的資料夾

cmake -B .\build .

cmake --build .\build --target <ProjectName>

 

生成可執行檔案

# 指定cmake最低版本

cmake_minimum_required(VERSION 2.8)

   

# 指定專案名

project(CppDemo)

# 生成可執行檔案,第一個引數為目標名,之後引數為原始檔列表

add_executable(${PROJECT_NAME} "main.cpp")

   

生成動態庫

cmake_minimum_required(VERSION 2.8)

project(HelloWorld)

   

# 新增標頭檔案

include_directories($ENV{JAVA_HOME}/include $ENV{JAVA_HOME}/include/win32)

   

# 設定生成目錄

SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})

   

# 生成連結庫檔案,三個引數分別是連結庫名、連結庫型別、原始碼檔案

add_library(${PROJECT_NAME} SHARED HelloWorld.cpp)