windows cmake教程(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 .”结果如下:

windows cmake教程(Windows环境CMake学习笔记二)(1)

备注:

  • 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>是可选项,用于设置构建项目所需的编程语言。该命令的实质是检查指定语言的编译器是否存在,以便工程能正确构建。

支持的语言包括C、 CXX(即 C )、 CUDA、OBJC(即 Objective-C)、OBJCXX、Fortran、HIP、ISPC和ASM。默认情况下,如果没有给出语言选项C,CXX则启用。指定 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 )

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页