Windows環(huán)境CMake學(xué)習(xí)筆記(二)

前言

第一篇學(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é)果如下:


01.ProjectName設(shè)置后隨同設(shè)置的其他變量情況.jpg

備注:

  • 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++)、 CUDAOBJC(即 Objective-C)、OBJCXX、Fortran、HIPISPCASM。默認情況下,如果沒有給出語言選項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 )
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容