Cmake之3.22版本重要特性及用法实例(十九)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者
新书发布:《Android系统多媒体进阶实战》🚀
优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1.前言
- 🌻2.Cmake之3.22版本介绍
- 🌻3.代码实例
🌻1.前言
本篇目的:Cmake之3.22版本重要特性及用法实例
🌻2.Cmake之3.22版本介绍
CMake 3.22 版本发布于 2021 年底,带来了众多改进和新特性,进一步提升了构建系统的功能和用户体验。以下是 CMake 3.22 版本的重要特性:
1. 支持 Apple Silicon 和 macOS Monterey
CMake 3.22 在对 Apple Silicon 支持的基础上,进一步优化了对 macOS Monterey 操作系统的兼容性。这意味着在新的 macOS 版本上,CMake 3.22 可以更好地处理构建任务,并充分利用 M1 和 M1 Pro 芯片的性能优势。
2. 改进的 CMakePresets.json
文件
CMake 3.22 对 CMakePresets.json
文件进行了进一步增强,增加了更多的配置选项和灵活性。开发者现在可以通过预设文件更容易地定义构建和测试的流程,并且预设的兼容性和可移植性得到了提升,这使得跨团队和跨平台的构建更加顺畅。
3. 支持 C++ 20 和 CUDA 11
CMake 3.22 在编译器特性支持方面也进行了增强,特别是对 C++ 20 标准和 CUDA 11 的支持。这一版本增加了对 C++ 20 特性检测的改进,确保开发者可以充分利用最新的 C++ 标准特性。此外,CMake 3.22 还提供了对 CUDA 11 新功能的支持,使得在 NVIDIA GPU 上的并行计算开发更加便捷。
4. FetchContent
模块的增强
FetchContent
模块在 CMake 3.22 中得到了改进,增加了对更多选项和参数的支持。FetchContent
允许开发者从远程资源中获取并构建依赖项,这一增强使得依赖管理更加灵活,特别是对于那些需要处理多个外部库的大型项目,显著提高了构建效率。
5. 改进的交叉编译支持
CMake 3.22 进一步改进了交叉编译的支持,特别是在处理不同平台和架构时表现更好。新版本提供了更加灵活的工具链文件配置选项,使得在复杂的交叉编译场景中,开发者可以更加容易地指定编译器、链接器等工具链参数,减少了手动配置的复杂性。
6. 支持 Android NDK r23
在移动平台开发方面,CMake 3.22 增加了对 Android NDK r23 的支持。开发者可以利用最新的 Android NDK 进行构建,享受更好的性能优化和兼容性支持。这一改进对于开发跨平台移动应用的团队来说非常重要。
7. add_custom_command
的改进
CMake 3.22 对 add_custom_command
命令进行了进一步优化,增加了对更多依赖管理选项的支持。通过这些改进,开发者可以更好地控制自定义命令的执行顺序和条件,确保复杂构建流程中的任务能够按预期顺利进行。
8. Find 模块的更新
CMake 3.22 对多个 Find 模块进行了更新,特别是对 Python 和 Boost 的支持得到了优化。这些改进使得 CMake 在查找和配置外部库时更加高效和可靠,减少了开发者在依赖管理上的困扰。
9. 改进的 CTest
测试功能
CMake 3.22 继续优化了 CTest
测试框架,新增了对分布式测试和并行测试的支持。这一增强使得开发者可以在大规模项目中更高效地执行自动化测试,缩短测试时间,同时确保测试结果的可靠性。
10. 性能提升和错误修复
CMake 3.22 通过一系列性能优化,进一步减少了构建时间,特别是在处理大型项目和复杂依赖时表现尤为明显。此外,新版本还修复了多个已知问题,提升了整体的稳定性和可靠性,为开发者提供了更顺畅的构建体验。
🌻3.代码实例
🐓3.1. CMAKE_POLICY_DEFAULT_CMP0126
- 功能描述: 在 CMake 3.22 中引入了
CMAKE_POLICY_DEFAULT_CMP0126
,它允许设置特定策略的默认行为,而不必在每个项目中单独设置。这对于团队和企业级项目管理非常有用。 - 文件例子:
# CMakeLists.txt cmake_minimum_required(VERSION 3.22) project(PolicyExample) # 设置默认策略行为 set(CMAKE_POLICY_DEFAULT_CMP0126 NEW) add_executable(MyApp main.cpp)
🐓3.2. 增强的 Apple Silicon 支持
- 功能描述: CMake 3.22 改进了对 Apple Silicon (ARM64) 架构的支持,尤其是为 macOS 11+ 提供了更好的兼容性和性能优化。
- 文件例子:
# CMakeLists.txt cmake_minimum_required(VERSION 3.22) project(AppleSiliconExample) # 为 Apple Silicon 平台配置 set(CMAKE_OSX_ARCHITECTURES "arm64") add_executable(MyApp main.cpp)
🐓3.3. 对 Intel OneAPI 编译器的支持
- 功能描述: CMake 3.22 新增了对 Intel OneAPI 编译器的支持,这使得 Intel 平台的高性能计算项目能够更好地集成和管理。
- 文件例子:
# CMakeLists.txt cmake_minimum_required(VERSION 3.22) project(IntelOneAPIExample) # 使用 Intel OneAPI 编译器 set(CMAKE_C_COMPILER icx) set(CMAKE_CXX_COMPILER icpx) add_executable(MyApp main.cpp)
🐓3.4. 增强的 target_link_options
- 功能描述: CMake 3.22 增强了
target_link_options
命令的功能,允许更灵活地管理链接器选项,尤其是在处理复杂的依赖关系时更加得心应手。 - 文件例子:
# CMakeLists.txt cmake_minimum_required(VERSION 3.22) project(LinkOptionsExample) add_executable(MyApp main.cpp) # 添加链接器选项 target_link_options(MyApp PRIVATE "-Wl,--as-needed")
🐓3.5. find_package
命令中的 REQUIRED_VERSION
支持
- 功能描述: CMake 3.22 为
find_package
命令新增了REQUIRED_VERSION
参数,允许指定最低的兼容库版本。这有助于确保项目中的依赖库符合最低要求。 - 文件例子:
# CMakeLists.txt cmake_minimum_required(VERSION 3.22) project(FindPackageExample) find_package(ZLIB REQUIRED_VERSION 1.2) add_executable(MyApp main.cpp) target_link_libraries(MyApp ZLIB::ZLIB)
🐓3.6. 增强的 ctest
支持
- 功能描述: CMake 3.22 中增强了
ctest
,引入了新的测试选项和并行测试支持,尤其是在管理大规模测试套件时更为便捷。 - 文件例子:
# 运行测试并显示时间统计信息 ctest --verbose --progress
🐓3.7. 对 Ninja Multi-Config 的改进
- 功能描述: CMake 3.22 进一步改进了对 Ninja Multi-Config 生成器的支持,允许更灵活地处理多配置项目,尤其是在 CI/CD 管道中。
- 文件例子:
# CMakeLists.txt cmake_minimum_required(VERSION 3.22) project(MultiConfigExample) set(CMAKE_CONFIGURATION_TYPES "Debug;Release") add_executable(MyApp main.cpp)
🐓3.8. cmake --install
的增强
- 功能描述: 在 CMake 3.22 中,
cmake --install
命令得到了增强,允许更精细地控制安装目标,并且新增了对DESTDIR
的支持。 - 文件例子:
cmake --install . --prefix /usr/local --component MyComponent
🐓3.9. 生成器表达式中的增强支持
- 功能描述: CMake 3.22 进一步增强了生成器表达式,支持更多的条件判断和配置选项,特别是在处理复杂的构建逻辑时非常实用。
- 文件例子:
# CMakeLists.txt cmake_minimum_required(VERSION 3.22) project(GeneratorExpressionsExample) add_executable(MyApp main.cpp) # 使用生成器表达式设置编译选项 target_compile_options(MyApp PRIVATE $<$<CONFIG:Debug>:-g> $<$<CONFIG:Release>:-O3>)
🐓3.10. 增强的工具链文件支持
- 功能描述: CMake 3.22 进一步增强了工具链文件的支持,特别是在跨平台开发中允许更灵活地指定编译器和构建工具链。
- 文件例子:
# Toolchain 文件 (my_toolchain.cmake)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER /path/to/compiler/gcc)
set(CMAKE_CXX_COMPILER /path/to/compiler/g++)
# CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project(ToolchainExample)
add_executable(MyApp main.cpp)
使用工具链文件进行构建:
cmake -DCMAKE_TOOLCHAIN_FILE=my_toolchain.cmake .
```