使用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) |