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是必须项,用于设置项目的名称。随着项目名称的设置如下变量将被赋值:
序号变量名作用
1PROJECT_NAME当前项目名称变量
2CMAKE_PROJECT_NAME顶级(CMake首次调用)项目名称变量
3PROJECT_SOURCE_DIR当前项目源目录的绝对路径
4<PROJECT_NAME>_SOURCE_DIR指定项目源目录的绝对路径
5PROJECT_BINARY_DIR当前项目二进制目录的绝对路径
6<PROJECT_NAME>_BINARY_DIR指定项目二进制目录的绝对路径
7PROJECT_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 .”结果如下:
在这里插入图片描述

备注:

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

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

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

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

project (CMakeFirstLevelProject DESCRIPTION "This is First")

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

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

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

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

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

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

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

project (CMakeFirstLevelProject LANGUAGES "CXX")

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

序号变量名作用
1PROJECT_HOMEPAGE_URL当前项目规范主页URL
2_HOMEPAGE_URL指定项目规范主页URL
3CMAKE_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 )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值