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 指定项目源目录的绝对路径
5 PROJECT_BINARY_DIR 当前项目二进制目录的绝对路径
6 <PROJECT_NAME>_BINARY_DIR 指定项目二进制目录的绝对路径
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设置后随同设置的其他变量情况
备注:

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

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

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

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

project (CMakeFirstLevelProject DESCRIPTION "This is First")

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

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

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

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

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

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

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

project (CMakeFirstLevelProject LANGUAGES "CXX")

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

序号 变量名 作用
1 PROJECT_HOMEPAGE_URL 当前项目规范主页URL
2 _HOMEPAGE_URL 指定项目规范主页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 )
posted @ 2022-09-20 21:16  好先生FX  阅读(179)  评论(0编辑  收藏  举报