前言
第一篇學(xué)習(xí)筆記通過構(gòu)建編譯最簡單的cpp項目了解CMake的使用方法。本篇文章將深入分析如下CMakeLists.txt涉及到的3個命令。CMake 支持大寫、小寫和大小寫混合命令,參數(shù)之間使用空格或跨行分隔。本篇文章命令參照官方示例使用小寫。
cmake_minimum_required(VERSION 3.24)
project(FirstProgram)
add_executable(hello.exe main.cpp)
第一個:腳本類型命令cmake_minimum_required
此命令的作用是:設(shè)置CMake需要的最低最高版本。
- 命令格式
cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])
- 命令說明
此命令必須被放置在第一行。 - 參數(shù)說明
1、VERSION關(guān)鍵字必須始終存在,提供的版本詳細信息必須至少有major.minor的部分。
2、FATAL_ERROR參數(shù)在2.6版本以后被忽略。 - 使用示例
1、設(shè)定CMake最低版本為3.24
cmake_minimum_required(VERSION 3.24)
(1)設(shè)定最低版本大于當(dāng)前系統(tǒng)安裝版本時,項目會立即停止并出現(xiàn)錯誤。
(2)設(shè)定最低版本小于等于當(dāng)前系統(tǒng)安裝版本時,項目正常處理。
2、同時設(shè)定CMake最低版本為3.2和最高版本為3.24
cmake_minimum_required(VERSION 3.2...3.24)
(1)設(shè)定最低版本大于當(dāng)前系統(tǒng)安裝版本時,項目會立即停止并出現(xiàn)錯誤。
(2)設(shè)定最高版本小于等于當(dāng)前系統(tǒng)安裝版本時,項目正常處理。
(3)設(shè)定最低和最高版本區(qū)間包含當(dāng)前版本當(dāng)前系統(tǒng)安裝版本時,項目正常處理。
(4)設(shè)定最低版本大于設(shè)定最高版本時,項目會立即停止并出現(xiàn)錯誤。
第二個:項目類型命令project
此命令的作用是:設(shè)置CMake項目的名稱(與生成的可執(zhí)行文件名沒有關(guān)聯(lián))。
- 命令格式
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])
- 命令說明
此命令必須被放置在調(diào)用它的命令之前和cmake_minimum_required命令之后。 - 參數(shù)說明
1、PROJECT-NAME是必須項,用于設(shè)置項目的名稱。隨著項目名稱的設(shè)置如下變量將被賦值:
| 序號 | 變量名 | 作用 |
|---|---|---|
| 1 | PROJECT_NAME | 當(dāng)前項目名稱變量 |
| 2 | CMAKE_PROJECT_NAME | 頂級(CMake首次調(diào)用)項目名稱變量 |
| 3 | PROJECT_SOURCE_DIR | 當(dāng)前項目源目錄的絕對路徑 |
| 4 | <PROJECT_NAME>_SOURCE_DIR | <PROJECT-NAME>指定項目源目錄的絕對路徑 |
| 5 | PROJECT_BINARY_DIR | 當(dāng)前項目二進制目錄的絕對路徑 |
| 6 | <PROJECT_NAME>_BINARY_DIR | <PROJECT-NAME>指定項目二進制目錄的絕對路徑 |
| 7 | PROJECT_IS_TOP_LEVEL | 指示當(dāng)前項目是否為頂級的布爾值 |
| 8 | <PROJECT_NAME>_IS_TOP_LEVEL | 指示<PROJECT_NAME>指定項目是否為頂級的布爾值 |
可以通過如下操作查看參數(shù)的區(qū)別所在
在D盤新建文件夾FirstLevel,然后在文件夾CMakeStudy中新建子文件夾SceondLevel。
在FirstLevel中新建CMakeLists.txt,寫入如下內(nèi)容:
cmake_minimum_required (VERSION 3.24)
project ("CMakeFirstLevelProject")
message ("FirstLevel PROJECT_NAME: ${PROJECT_NAME}")
message ("FirstLevel CMAKE_PROJECT_NAME: ${CMAKE_PROJECT_NAME}")
message ("FirstLevel PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
message ("FirstLevel <PROJECT_NAME>_SOURCE_DIR: ${${PROJECT_NAME}_SOURCE_DIR}")
message ("FirstLevel PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
message ("FirstLevel <PROJECT_NAME>_BINARY_DIR: ${${PROJECT_NAME}_BINARY_DIR}")
message ("FirstLevel PROJECT_IS_TOP_LEVEL: ${PROJECT_IS_TOP_LEVEL}")
message ("FirstLevel <PROJECT-NAME>_IS_TOP_LEVEL: ${${PROJECT_NAME}_IS_TOP_LEVEL}")
# 調(diào)用SecondLevel中的CMakeList.txt(此命令先用暫時不用學(xué)習(xí))
add_subdirectory (SecondLevel)
在SecondLevel中新建CMakeLists.txt,寫入如下內(nèi)容:
cmake_minimum_required (VERSION 3.24)
project ("CMakeSecondLevelProject")
message ("→SceondLevel PROJECT_NAME: ${PROJECT_NAME}")
message ("→SceondLevel CMAKE_PROJECT_NAME: ${CMAKE_PROJECT_NAME}")
message ("→SceondLevel PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
message ("→SceondLevel <PROJECT_NAME>_SOURCE_DIR: ${${PROJECT_NAME}_SOURCE_DIR}")
message ("→SceondLevel PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
message ("→SceondLevel <PROJECT_NAME>_BINARY_DIR: ${${PROJECT_NAME}_BINARY_DIR}")
message ("→SceondLevel PROJECT_IS_TOP_LEVEL: ${PROJECT_IS_TOP_LEVEL}")
message ("→SceondLevel <PROJECT-NAME>_IS_TOP_LEVEL: ${${PROJECT_NAME}_IS_TOP_LEVEL}")
在FirstLevel文件中調(diào)用命令提示符執(zhí)行“cmake .”結(jié)果如下:

備注:
- message命令暫時只需要知道可以將內(nèi)容輸出到命令提示符中就可以了。
- “cmake .”一個點表示在當(dāng)前文件夾中尋找CMakeLists.txt生成相關(guān)文件。
- “cmake ..”兩個點表示在上層文件夾下尋找CMakeLists.txt生成相關(guān)文件。
2、VERSION <version>是可選項,用于設(shè)置當(dāng)前CMake項目的版本。格式<major>[.<minor>[.<patch>[.<tweak>]]]。
格式示例
project (CMakeFirstLevelProject VERSION 2.1.0.3)
隨著版本的設(shè)置如下變量將被賦值:
| 序號 | 變量名 | 作用 |
|---|---|---|
| 1 | PROJECT_VERSION | 當(dāng)前項目版本 |
| 2 | <PROJECT-NAME>_VERSION | <PROJECT-NAME>指定項目版本 |
| 3 | PROJECT_VERSION_MAJOR | 當(dāng)前項目版本MAJOR部分 |
| 4 | <PROJECT-NAME>_VERSION_MAJOR | <PROJECT-NAME>指定項目版本MAJOR部分 |
| 5 | PROJECT_VERSION_MINOR | 當(dāng)前項目版本MINOR部分 |
| 6 | <PROJECT-NAME>_VERSION_MINOR | <PROJECT-NAME>指定項目版本MINOR部分 |
| 7 | PROJECT_VERSION_PATCH | 當(dāng)前項目版本PATCH部分 |
| 8 | <PROJECT-NAME>_VERSION_PATCH | <PROJECT-NAME>指定項目版本PATCH部分 |
| 9 | PROJECT_VERSION_TWEAK | 當(dāng)前項目版本TWEAK部分 |
| 10 | <PROJECT-NAME>_VERSION_TWEAK | <PROJECT-NAME>指定項目版本TWEAK部分 |
| 11 | CMAKE_PROJECT_VERSION | 頂級(CMake首次調(diào)用)項目版本 |
3、DESCRIPTION <project-description-string>是可選項,用于設(shè)置當(dāng)前CMake項目較短的描述。
格式示例
project (CMakeFirstLevelProject DESCRIPTION "This is First")
隨著描述的設(shè)置如下變量將被賦值:
| 序號 | 變量名 | 作用 |
|---|---|---|
| 1 | PROJECT_DESCRIPTION | 當(dāng)前項目描述 |
| 2 | <PROJECT-NAME>_DESCRIPTION | <PROJECT-NAME>指定項目描述 |
| 3 | CMAKE_PROJECT_VERSION | 頂級(CMake首次調(diào)用)項目描述 |
4、HOMEPAGE_URL <url-string>是可選項,用于設(shè)置項目的規(guī)范主頁 URL。
格式示例
project (CMakeFirstLevelProject HOMEPAGE_URL "https://xxx.xxx")
隨著規(guī)范主頁URL的設(shè)置如下變量將被賦值:
| 序號 | 變量名 | 作用 |
|---|---|---|
| 1 | PROJECT_HOMEPAGE_URL | 當(dāng)前項目規(guī)范主頁URL |
| 2 | <PROJECT-NAME>_HOMEPAGE_URL | <PROJECT-NAME>指定項目規(guī)范主頁URL |
| 3 | CMAKE_HOMEPAGE_URL | 頂級(CMake首次調(diào)用)項目規(guī)范主頁URL |
5、LANGUAGES <language-name>是可選項,用于設(shè)置構(gòu)建項目所需的編程語言。該命令的實質(zhì)是檢查指定語言的編譯器是否存在,以便工程能正確構(gòu)建。
支持的語言包括C、CXX(即 C++)、 CUDA、OBJC(即 Objective-C)、OBJCXX、Fortran、HIP、ISPC和ASM。默認情況下,如果沒有給出語言選項C,CXX則啟用。指定 language NONE,或使用LANGUAGES關(guān)鍵字并不列出任何語言,以跳過啟用任何語言。
格式示例
project (CMakeFirstLevelProject LANGUAGES "CXX")
隨著規(guī)范主頁URL的設(shè)置如下變量將被賦值:
| 序號 | 變量名 | 作用 |
|---|---|---|
| 1 | PROJECT_HOMEPAGE_URL | 當(dāng)前項目規(guī)范主頁URL |
| 2 | <PROJECT-NAME>_HOMEPAGE_URL | <PROJECT-NAME>指定項目規(guī)范主頁URL |
| 3 | CMAKE_HOMEPAGE_URL | 頂級(CMake首次調(diào)用)項目規(guī)范主頁URL |
第三個:項目類型命令add_executable
此命令分為三種情況。
** 第一種情況:使用指定的源文件來生成目標(biāo)可執(zhí)行文件。**
- 命令格式
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
- 命令說明
默認情況下,輸出路徑和源文件的結(jié)構(gòu)相匹配(例如源文件中CMakeLists.txt在FirstLevel文件夾,則默認的可執(zhí)行文件也在編譯路徑的FirstLevel文件夾)。 - 參數(shù)說明
1、name設(shè)置構(gòu)建的可執(zhí)行文件的文件名,在項目中必須是全局唯一的。
2、WIN32被賦予屬性WIN32_EXECUTABLE將在創(chuàng)建的目標(biāo)上設(shè)置。在 Windows 上構(gòu)建一個帶有 WinMain 入口點的可執(zhí)行文件。
格式示例
ADD_EXECUTABLE(CMakeSetup WIN32 ${SRCS})
3、如果MACOSX_BUNDLE給出相應(yīng)的屬性,將在創(chuàng)建的目標(biāo)上設(shè)置。在 macOS 或 iOS 上將可執(zhí)行文件構(gòu)建為應(yīng)用程序包。
4、如果EXCLUDE_FROM_ALL給出相應(yīng)的屬性,將在創(chuàng)建的目標(biāo)上設(shè)置。如果排除在外,make默認情況下,在包含目錄或其祖先中運行將不會構(gòu)建目標(biāo)。
5、source構(gòu)建可執(zhí)行文件所需要的源文件。可以通過target_sources命令添加。
** 第二種情況:導(dǎo)入的可執(zhí)行文件。**
- 命令格式
add_executable(<name> IMPORTED [GLOBAL])
- 參數(shù)說明
1、name導(dǎo)入的可執(zhí)行文件名。
2、IMPORTED選項指定后,屬性IMPORTED會被置為TRUE,在工程內(nèi)構(gòu)建的可執(zhí)行目標(biāo)文件的屬性IMPORTED會被置為FALSE。
3、指定GLOBAL則會將可執(zhí)行目標(biāo)文件的范圍創(chuàng)建文件的目錄及子目錄范圍擴大到整個工程。 - 命令示例
add_executable(helloWorld::helloWorld IMPORTED)
** 第三種情況:別名可執(zhí)行文件。**
- 命令格式
add_executable(<name> ALIAS <target>)
- 命令說明
創(chuàng)建該別名后,可以使用別名進行可執(zhí)行目標(biāo)的讀、測試操作,但是不能利用別名對可執(zhí)行目標(biāo)的修改屬性操作。 - 參數(shù)說明
name導(dǎo)入的可執(zhí)行文件名。 - 命令示例
add_executable(fristLevel ALIAS helloWorld )