文章目錄
CMake教程版本號:3.16.3
英文原文鏈接: https://cmake.org/cmake/help/latest/guide/tutorial/index.html#id2
github示例代碼 https://github.com/sxpsxp12/cmake-learning-exampes
開始
最基本的項目就是基於源碼構建一個可執行程序。對於一個最簡單的項目,CMakefile.txt
三行就可以搞定。我們的教程就以此作爲開始。首先需要在我們的項目根目錄下創建一個CMakefile.txt文件。
cmake_minimum_required(VERSION 3.10)
# set the project name
project(helloworld)
# add the executable
add_executable(helloworld main.cpp)
注意:在上面的例子中,我們使用了小寫的命令。但是CMake是支持大寫,小寫和大小寫混合命令的。
添加版本號和配置的頭文件
第一個特性就是我們將爲我們的可執行程序和項目添加一個版本號,雖然可以在源代碼中指定,但是在CMakefile.txt文件中配置是更加靈活的。
首先修改CMakefile.txt文件以支持版本號
cmake_minimum_required(VERSION 3.10)
#set the project name and version
project(helloworld VERSION 1.0)
然後,配置一個頭文件,以便將版本號傳給源文件
configure_file(version.h.in version.h)
因爲配置文件會被寫到二進制樹中,所以我們必須添加那個目錄,以便加入搜索頭文件的目錄列表中。在CMakefile.txt
文件最後一行添加以下內容:
target_include_directories(helloworld PUBLIC
"${PROJECT_BINARY_DIR}"
)
使用你的IDE,在源碼目錄下創建version.h.in
文件,並填加內容如下:
// the configured options and settings for Tutorial
#define Helloworld_VERSION_MAJOR @helloworld_VERSION_MAJOR@
#define Helloworld_VERSION_MINOR @helloworld_VERSION_MINOR@
當CMake配置了這個頭文件時,@helloworld_VERSION_MAJOR@
和@helloworld_VERSION_MINOR@
的值會被替換。
接下來,修改main.cpp,包含配置的頭文件version.h
最終,我們就可以在源代碼中打印出來版本號了。
std::cout << "major:" << int(Helloworld_VERSION_MAJOR) << std::endl;
std::cout << "minor:" << int(Helloworld_VERSION_MINOR) << std::endl;
指定C++標準
我們需要在CMake文件中明確聲明正確的標誌。本3.16版本中,通過指定CMAKE_CXX_STANDARD
變量爲11,且CMAKE_CXX_STANDARD_REQUIRED
變量爲True。
cmake_minimum_required(VERSION 3.10)
# set the project name and version
project(helloworld VERSION 1.0)
# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
構建項目
項目目錄樹tree
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ ├── helloworld
│ ├── Makefile
├── CMakeLists.txt
└── main.cpp
3 directories, 7 files
在build目錄下,運行cmake
cmake ..
執行完構建命令後,會生成三個文件CMakeCache.txt、Makefile、cmake_install.cmake和一個文件夾CMakeFiles,然後執行make
make
執行完make,即可看到二進制可執行程序helloworld
./helloworld
總結
本節我們學習到的CMake命令及其含義如下:
cmake_minimum_required
所屬:腳本指令,總是可用的
配置這個項目所需要的cmake最小版本號
cmake_minimum_required(VERSION <min>[...<max>] [FATAL_ERROR])
和可選的都是major.minor[.patch[.tweak]]
格式的CMake版本號,...
是文本字符串。
如果cmake的版本號低於,會停止處理項目並報告一個錯誤。可選的如果指定了,必須大於等於。3.12之前的版本對於...
的處理結果是,...<max>
部分會被忽略,只保留3.12之前版本的特性。
注意 cmake_minimum_required
的調用必須在project()
命令之前。
project
所屬:項目命令,只能用於CMake項目
配置項目的名字
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])
配置項目的名字,並且將項目名存儲在CMake變量PROJECT_NAME
,當根目錄的CMakefile.txt調用後,會存儲在CMake變量CMAKE_PROJECT_NAME
中。
命令參數中的關鍵字如果沒有配置,對應的CMake變量會默認設置爲空字符串。
-
VERSION
- 可選
- 非負整數,並且會設置對應的變量
PROJECT_VERSION, <PROJECT-NAME>_VERSION PROJECT_VERSION_MAJOR, <PROJECT-NAME>_VERSION_MAJOR PROJECT_VERSION_MINOR, <PROJECT-NAME>_VERSION_MINOR PROJECT_VERSION_PATCH, <PROJECT-NAME>_VERSION_PATCH PROJECT_VERSION_TWEAK, <PROJECT-NAME>_VERSION_TWEAK.
- 項目根目錄的CMakefile.txt調用時,會存儲到
CMAKE_PROJECT_NAME
中
-
DESCRIPTION
- 可選
- 對應的變量
PROJECT_DESCRIPTION, <PROJECT-NAME>_DESCRIPTION
- 描述信息建議相對簡短的字符串,通常幾句話來描述。
- 項目根目錄的CMakefile.txt調用時,會存儲到
CMAKE_PROJECT_DESCRIPTION
中
-
HOEMPAGE_URL
- 可選
- 對應的變量
PROJECT_HOMEPAGE_URL, <PROJECT-NAME>_HOMEPAGE_URL
- 是項目主頁的URL
- 項目根目錄的CMakefile.txt調用時,會存儲到
CMAKE_PROJECT_HOMEPAGE_URL
中
-
LANGUAGE
- 可選
- 標識編程語言,如果沒有配置,默認是C和CXX。指定該關鍵字爲NONE,或者LANGUAGE關鍵字但是沒有聲明語言,會禁用所有語言。可填:C,CXX,OBJC,OBJCXX,Fortran,ASM。
- 如果啓用ASM,請最後列出它,以便CMake可以檢查其他語言(例如C)的編譯器是否也可以進行彙編
add_executable
所屬:項目命令,只能用於CMake項目
使用指定的源文件將可執行文件添加到項目中。
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
根據列舉的源文件列表來構建可執行程序(如果之後使用target_source
添加源文件,那麼此處可以省略)。在項目中必須是全局唯一的。
關鍵字 [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL]如果配置了,那麼會爲二進制可執行程序關聯對應的屬性。具體描述可查看 https://cmake.org/cmake/help/latest/command/add_executable.html
configure_file
所屬:腳本指令,總是可用的
拷貝輸入文件到另外一個文件中,並修改其內容
configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
對應的值表示爲@VAR@或者${VAR},每個變量引用都會使用當前變量的值進行替換,比如:
# cmakedefine VAR ...
會被替換成
#define VAR ...
或者
/* #undef VAR */
依賴於CMake是否在if()中爲VAR配置了值。#cmakedefine01形式的輸入文件,將會被替換成#define VAR 1或者#define VAR 0。
相關例子可以查看: https://cmake.org/cmake/help/latest/command/configure_file.html
對於配置的頭文件,可以使用以下命令來指定頭文件目錄,以便源文件可以使用該頭文件
include_directories(${CMAKE_CURRENT_BINARY_DIR})
target_include_directories
所屬:項目命令,只能用於CMake項目
爲可執行程序提供頭文件目錄
target_include_directories(<target> [SYSTEM] [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
當編譯可執行程序時使用,來制定頭文件目錄,必須是命令 add_executable() or add_library()創建的,不能是一個別名。
[BEFORE]關鍵字配置後,後面的參數會作爲對應屬性的前綴。
INTERFACE PRIVATE PUBLIC關鍵字會指定接下來參數的作用域。
PRIVATE PUBLIC項會暴露給INCLUDE_DIRECTORIES的屬性。PUBLIC和INTERFACE項會暴露給INTERFACE_INCLUDE_DIRECTORIES的屬性。剩下的參數指定頭文件的目錄。
指定頭文件的目錄可以是絕對路徑,也可以是相對路徑,多次給調用該指令,會按照順序追加到可執行對象中。
其他信息可參照: https://cmake.org/cmake/help/latest/command/target_include_directories.html
set
所屬:腳本指令,總是可用的
將普通變量,緩衝變量,環境變量設置爲某個值。
設置普通變量
set(<variable> <value>... [PARENT_SCOPE])
設置緩衝變量
set(<variable> <value>... CACHE <type> <docstring> [FORCE])
設置環境變量
set(ENV{<variable>} [<value>])
更多信息請查看: https://cmake.org/cmake/help/latest/command/set.html
歡迎各位大佬右側點贊、關注、打賞,我們再會。。。