Windows环境CMake学习笔记(二)

前言

第一篇学习笔记通过构建编译最简单的cpp项目了解CMake的使用方法。本篇文章将深入分析如下CMakeLists.txt涉及到的3个命令。CMake 支持大写、小写和大小写混合命令,参数之间使用空格或跨行分隔。本篇文章命令参照官方示例使用小写。

cmake_minimum_required(VERSION 3.24)
project(FirstProgram)
add_executable(hello.exe main.cpp)

第一个:脚本类型命令cmake_minimum_required

此命令的作用是:设置CMake需要的最低最高版本。

  • 命令格式
cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])
  • 命令说明
    此命令必须被放置在第一行。
  • 参数说明
    1、VERSION关键字必须始终存在,提供的版本详细信息必须至少有major.minor的部分。
    2、FATAL_ERROR参数在2.6版本以后被忽略。
  • 使用示例
    1、设定CMake最低版本为3.24
cmake_minimum_required(VERSION 3.24)

(1)设定最低版本大于当前系统安装版本时,项目会立即停止并出现错误。
(2)设定最低版本小于等于当前系统安装版本时,项目正常处理。
2、同时设定CMake最低版本为3.2和最高版本为3.24

cmake_minimum_required(VERSION 3.2...3.24)

(1)设定最低版本大于当前系统安装版本时,项目会立即停止并出现错误。
(2)设定最高版本小于等于当前系统安装版本时,项目正常处理。
(3)设定最低和最高版本区间包含当前版本当前系统安装版本时,项目正常处理。
(4)设定最低版本大于设定最高版本时,项目会立即停止并出现错误。

第二个:项目类型命令project

此命令的作用是:设置CMake项目的名称(与生成的可执行文件名没有关联)。

  • 命令格式
project(<PROJECT-NAME>
        [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
        [DESCRIPTION <project-description-string>]
        [HOMEPAGE_URL <url-string>]
        [LANGUAGES <language-name>...])
  • 命令说明
    此命令必须被放置在调用它的命令之前和cmake_minimum_required命令之后。
  • 参数说明
    1、PROJECT-NAME是必须项,用于设置项目的名称。随着项目名称的设置如下变量将被赋值:
序号 变量名 作用
1 PROJECT_NAME 当前项目名称变量
2 CMAKE_PROJECT_NAME 顶级(CMake首次调用)项目名称变量
3 PROJECT_SOURCE_DIR 当前项目源目录的绝对路径
4 <PROJECT_NAME>_SOURCE_DIR <PROJECT-NAME>指定项目源目录的绝对路径
5 PROJECT_BINARY_DIR 当前项目二进制目录的绝对路径
6 <PROJECT_NAME>_BINARY_DIR <PROJECT-NAME>指定项目二进制目录的绝对路径
7 PROJECT_IS_TOP_LEVEL 指示当前项目是否为顶级的布尔值
8 <PROJECT_NAME>_IS_TOP_LEVEL 指示<PROJECT_NAME>指定项目是否为顶级的布尔值

可以通过如下操作查看参数的区别所在

在D盘新建文件夹FirstLevel,然后在文件夹CMakeStudy中新建子文件夹SceondLevel。
在FirstLevel中新建CMakeLists.txt,写入如下内容:

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}")
# 调用SecondLevel中的CMakeList.txt(此命令先用暂时不用学习)
add_subdirectory (SecondLevel) 

在SecondLevel中新建CMakeLists.txt,写入如下内容:

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文件中调用命令提示符执行“cmake .”结果如下:


01.ProjectName设置后随同设置的其他变量情况.jpg

备注:

  • message命令暂时只需要知道可以将内容输出到命令提示符中就可以了。
  • “cmake .”一个点表示在当前文件夹中寻找CMakeLists.txt生成相关文件。
  • “cmake ..”两个点表示在上层文件夹下寻找CMakeLists.txt生成相关文件。
    2、VERSION <version>是可选项,用于设置当前CMake项目的版本。格式<major>[.<minor>[.<patch>[.<tweak>]]]。
    格式示例
project (CMakeFirstLevelProject VERSION 2.1.0.3)

随着版本的设置如下变量将被赋值:

序号 变量名 作用
1 PROJECT_VERSION 当前项目版本
2 <PROJECT-NAME>_VERSION <PROJECT-NAME>指定项目版本
3 PROJECT_VERSION_MAJOR 当前项目版本MAJOR部分
4 <PROJECT-NAME>_VERSION_MAJOR <PROJECT-NAME>指定项目版本MAJOR部分
5 PROJECT_VERSION_MINOR 当前项目版本MINOR部分
6 <PROJECT-NAME>_VERSION_MINOR <PROJECT-NAME>指定项目版本MINOR部分
7 PROJECT_VERSION_PATCH 当前项目版本PATCH部分
8 <PROJECT-NAME>_VERSION_PATCH <PROJECT-NAME>指定项目版本PATCH部分
9 PROJECT_VERSION_TWEAK 当前项目版本TWEAK部分
10 <PROJECT-NAME>_VERSION_TWEAK <PROJECT-NAME>指定项目版本TWEAK部分
11 CMAKE_PROJECT_VERSION 顶级(CMake首次调用)项目版本

3、DESCRIPTION <project-description-string>是可选项,用于设置当前CMake项目较短的描述。
格式示例

project (CMakeFirstLevelProject DESCRIPTION "This is First")

随着描述的设置如下变量将被赋值:

序号 变量名 作用
1 PROJECT_DESCRIPTION 当前项目描述
2 <PROJECT-NAME>_DESCRIPTION <PROJECT-NAME>指定项目描述
3 CMAKE_PROJECT_VERSION 顶级(CMake首次调用)项目描述

4、HOMEPAGE_URL <url-string>是可选项,用于设置项目的规范主页 URL。
格式示例

project (CMakeFirstLevelProject HOMEPAGE_URL "https://xxx.xxx")

随着规范主页URL的设置如下变量将被赋值:

序号 变量名 作用
1 PROJECT_HOMEPAGE_URL 当前项目规范主页URL
2 <PROJECT-NAME>_HOMEPAGE_URL <PROJECT-NAME>指定项目规范主页URL
3 CMAKE_HOMEPAGE_URL 顶级(CMake首次调用)项目规范主页URL

5、LANGUAGES <language-name>是可选项,用于设置构建项目所需的编程语言。该命令的实质是检查指定语言的编译器是否存在,以便工程能正确构建。
支持的语言包括CCXX(即 C++)CUDAOBJC(即 Objective-C)OBJCXXFortranHIPISPCASM。默认情况下,如果没有给出语言选项CCXX则启用。指定 language NONE,或使用LANGUAGES关键字并不列出任何语言,以跳过启用任何语言。
格式示例

project (CMakeFirstLevelProject LANGUAGES "CXX")

随着规范主页URL的设置如下变量将被赋值:

序号 变量名 作用
1 PROJECT_HOMEPAGE_URL 当前项目规范主页URL
2 <PROJECT-NAME>_HOMEPAGE_URL <PROJECT-NAME>指定项目规范主页URL
3 CMAKE_HOMEPAGE_URL 顶级(CMake首次调用)项目规范主页URL

第三个:项目类型命令add_executable

此命令分为三种情况。

** 第一种情况:使用指定的源文件来生成目标可执行文件。**

  • 命令格式
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
               [EXCLUDE_FROM_ALL]
               [source1] [source2 ...])
  • 命令说明
    默认情况下,输出路径和源文件的结构相匹配(例如源文件中CMakeLists.txt在FirstLevel文件夹,则默认的可执行文件也在编译路径的FirstLevel文件夹)。
  • 参数说明
    1、name设置构建的可执行文件的文件名,在项目中必须是全局唯一的。
    2、WIN32被赋予属性WIN32_EXECUTABLE将在创建的目标上设置。在 Windows 上构建一个带有 WinMain 入口点的可执行文件。
    格式示例
ADD_EXECUTABLE(CMakeSetup WIN32 ${SRCS})

3、如果MACOSX_BUNDLE给出相应的属性,将在创建的目标上设置。在 macOS 或 iOS 上将可执行文件构建为应用程序包。
4、如果EXCLUDE_FROM_ALL给出相应的属性,将在创建的目标上设置。如果排除在外,make默认情况下,在包含目录或其祖先中运行将不会构建目标。
5、source构建可执行文件所需要的源文件。可以通过target_sources命令添加。

** 第二种情况:导入的可执行文件。**

  • 命令格式
add_executable(<name> IMPORTED [GLOBAL])
  • 参数说明
    1、name导入的可执行文件名。
    2、IMPORTED选项指定后,属性IMPORTED会被置为TRUE,在工程内构建的可执行目标文件的属性IMPORTED会被置为FALSE。
    3、指定GLOBAL则会将可执行目标文件的范围创建文件的目录及子目录范围扩大到整个工程。
  • 命令示例
add_executable(helloWorld::helloWorld IMPORTED)

** 第三种情况:别名可执行文件。**

  • 命令格式
add_executable(<name> ALIAS <target>)
  • 命令说明
    创建该别名后,可以使用别名进行可执行目标的读、测试操作,但是不能利用别名对可执行目标的修改属性操作。
  • 参数说明
    name导入的可执行文件名。
  • 命令示例
add_executable(fristLevel ALIAS helloWorld )
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容