CMake教程---開始CMake的學習(第一課)

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


歡迎各位大佬右側點贊、關注、打賞,我們再會。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章