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 .”结果如下:
备注:
- message命令暂时只需要知道可以将内容输出到命令提示符中就可以了。
- “cmake .”一个点表示在当前文件夹中寻找CMakeLists.txt生成相关文件。
- “cmake ..”两个点表示在上层文件夹下寻找CMakeLists.txt生成相关文件。
2、VERSION是可选项,用于设置当前CMake项目的版本。格式 [. [. [. ]]]。
格式示例
project (CMakeFirstLevelProject VERSION 2.1.0.3)
随着版本的设置如下变量将被赋值:
序号 | 变量名 | 作用 |
---|---|---|
1 | PROJECT_VERSION | 当前项目版本 |
2 | ||
3 | PROJECT_VERSION_MAJOR | 当前项目版本MAJOR部分 |
4 | ||
5 | PROJECT_VERSION_MINOR | 当前项目版本MINOR部分 |
6 | ||
7 | PROJECT_VERSION_PATCH | 当前项目版本PATCH部分 |
8 | ||
9 | PROJECT_VERSION_TWEAK | 当前项目版本TWEAK部分 |
10 | ||
11 | CMAKE_PROJECT_VERSION | 顶级(CMake首次调用)项目版本 |
3、DESCRIPTION
格式示例
project (CMakeFirstLevelProject DESCRIPTION "This is First")
随着描述的设置如下变量将被赋值:
序号 | 变量名 | 作用 |
---|---|---|
1 | PROJECT_DESCRIPTION | 当前项目描述 |
2 | ||
3 | CMAKE_PROJECT_VERSION | 顶级(CMake首次调用)项目描述 |
4、HOMEPAGE_URL
格式示例
project (CMakeFirstLevelProject HOMEPAGE_URL "https://xxx.xxx")
随着规范主页URL的设置如下变量将被赋值:
序号 | 变量名 | 作用 |
---|---|---|
1 | PROJECT_HOMEPAGE_URL | 当前项目规范主页URL |
2 | ||
3 | CMAKE_HOMEPAGE_URL | 顶级(CMake首次调用)项目规范主页URL |
5、LANGUAGES
支持的语言包括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 | ||
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 )
博客园-本文作者(好先生FX http://www.cnblogs.com/hxsfx)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。