🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

CMake 高级特性完全指南

🎯 一、现代 CMake 目标导向编程(Target-Based)

1.1 从全局变量到目标中心

1.2 目标属性管理核心命令

1.3 作用域说明

📋 二、CMake Presets 预设配置(3.19+)

2.1 核心概念

2.2 文件结构

2.3 完整示例

2.4 使用方式

🔗 三、高级依赖管理

3.1 find_package 高级模式

3.2 FetchContent 在线依赖

3.3 自定义查找模块

🌍 四、交叉编译与工具链

4.1 工具链文件示例

4.2 Presets 集成交叉编译

🔍 五、高级调试与诊断

5.1 命令行诊断参数

5.2 条件编译与诊断

5.3 变量检查

📦 六、模块化与代码复用

6.1 项目结构最佳实践

6.2 子目录模块化

6.3 导出配置供外部使用

⚡ 七、性能优化特性

7.1 并行构建

7.2 链接时优化(LTO)

7.3 预编译头文件

🛠️ 八、高级特性速查表

8.1 生成器表达式示例

📚 九、推荐资源


img

CMake 高级特性完全指南

根据最新资料(2025-2026),我为您整理了一份全面的 CMake 高级特性指南:


🎯 一、现代 CMake 目标导向编程(Target-Based)

1.1 从全局变量到目标中心

传统方式(不推荐):

include_directories(${PROJECT_SOURCE_DIR}/include)
link_directories(${PROJECT_SOURCE_DIR}/lib)
add_executable(myapp main.cpp)
target_link_libraries(myapp mylib)

现代方式(推荐):

add_library(mylib STATIC src/lib.cpp)
target_include_directories(mylib PUBLIC include/)
target_compile_features(mylib PUBLIC cxx_std_17)

add_executable(myapp main.cpp)
target_link_libraries(myapp PRIVATE mylib)

1.2 目标属性管理核心命令

命令 用途 作用域
target_compile_features() 指定编译特性/标准 PUBLIC/PRIVATE/INTERFACE
target_include_directories() 包含目录 PUBLIC/PRIVATE/INTERFACE
target_compile_definitions() 编译定义 PUBLIC/PRIVATE/INTERFACE
target_compile_options() 编译选项 PUBLIC/PRIVATE/INTERFACE
target_link_libraries() 链接库 PUBLIC/PRIVATE/INTERFACE

1.3 作用域说明

# PUBLIC: 自身和目标使用者都需要
target_include_directories(mylib PUBLIC include/)

# PRIVATE: 仅自身需要
target_include_directories(mylib PRIVATE src/)

# INTERFACE: 仅目标使用者需要(头文件库)
target_include_directories(header_only_lib INTERFACE include/)

📋 二、CMake Presets 预设配置(3.19+)

2.1 核心概念

CMake 3.19 引入的 Presets 功能通过 JSON 文件统一管理构建配置,支持:

  • ✅ 跨平台配置共享
  • ✅ IDE 原生支持(VS Code、Visual Studio、CLion)
  • ✅ CI/CD 管道集成
  • ✅ 预设继承与组合

2.2 文件结构

project/
├── CMakePresets.json        # 项目级配置(提交到版本控制)
├── CMakeUserPresets.json    # 个人配置(不提交)
└── CMakeLists.txt

2.3 完整示例

{
  "version": 6,
  "cmakeMinimumRequired": {
    "major": 3,
    "minor": 19,
    "patch": 0
  },
  "configurePresets": [
    {
      "name": "base",
      "hidden": true,
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build/${presetName}",
      "cacheVariables": {
        "CMAKE_EXPORT_COMPILE_COMMANDS": true,
        "CMAKE_CXX_STANDARD": "17",
        "CMAKE_CXX_STANDARD_REQUIRED": true
      }
    },
    {
      "name": "debug",
      "inherits": "base",
      "displayName": "Debug Build",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug"
      }
    },
    {
      "name": "release",
      "inherits": "base",
      "displayName": "Release Build",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release"
      }
    },
    {
      "name": "windows-x64",
      "inherits": "release",
      "condition": {
        "type": "equals",
        "lhs": "${hostSystemName}",
        "rhs": "Windows"
      },
      "architecture": "x64"
    }
  ],
  "buildPresets": [
    {
      "name": "debug-build",
      "configurePreset": "debug",
      "configuration": "Debug"
    },
    {
      "name": "release-build",
      "configurePreset": "release",
      "configuration": "Release"
    }
  ],
  "testPresets": [
    {
      "name": "debug-test",
      "configurePreset": "debug",
      "output": {
        "outputOnFailure": true
      }
    }
  ]
}

2.4 使用方式

# 列出所有预设
cmake --list-presets

# 使用预设配置
cmake --preset=debug

# 使用预设构建
cmake --build --preset=debug-build

# 使用预设测试
ctest --preset=debug-test

🔗 三、高级依赖管理

3.1 find_package 高级模式

# 模块模式(使用 Find<Package>.cmake)
find_package(Boost 1.75 REQUIRED COMPONENTS filesystem system)

# 配置模式(使用 PackageConfig.cmake)
find_package(Qt6 6.0 REQUIRED COMPONENTS Core Widgets)

# 静默模式
find_package(OptionalLib QUIET)
if(OptionalLib_FOUND)
    target_link_libraries(myapp PRIVATE OptionalLib::OptionalLib)
endif()

3.2 FetchContent 在线依赖

include(FetchContent)

FetchContent_Declare(
    nlohmann_json
    GIT_REPOSITORY https://github.com/nlohmann/json.git
    GIT_TAG        v3.11.2
)
FetchContent_MakeAvailable(nlohmann_json)

target_link_libraries(myapp PRIVATE nlohmann_json::nlohmann_json)

3.3 自定义查找模块

# cmake/modules/FindMyLib.cmake
find_path(MYLIB_INCLUDE_DIR mylib.h)
find_library(MYLIB_LIBRARY mylib)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MyLib
    REQUIRED_VARS MYLIB_LIBRARY MYLIB_INCLUDE_DIR
)

if(MyLib_FOUND)
    add_library(MyLib::MyLib UNKNOWN IMPORTED)
    set_target_properties(MyLib::MyLib PROPERTIES
        IMPORTED_LOCATION "${MYLIB_LIBRARY}"
        INTERFACE_INCLUDE_DIRECTORIES "${MYLIB_INCLUDE_DIR}"
    )
endif()

🌍 四、交叉编译与工具链

4.1 工具链文件示例

# toolchains/arm-linux-gnueabihf.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)

set(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabihf)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

4.2 Presets 集成交叉编译

{
  "configurePresets": [
    {
      "name": "arm-cross",
      "displayName": "ARM Cross Compile",
      "toolchainFile": "${sourceDir}/toolchains/arm-linux-gnueabihf.cmake",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release"
      }
    }
  ]
}

🔍 五、高级调试与诊断

5.1 命令行诊断参数

# 显示详细日志
cmake --log-level=DEBUG ..

# 追踪执行
cmake --trace ..

# 追踪扩展(显示变量值)
cmake --trace-expand ..

# 生成编译数据库(用于 IDE 智能提示)
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..

5.2 条件编译与诊断

# 打印调试信息
message(STATUS "Current build type: ${CMAKE_BUILD_TYPE}")
message(VERBOSE "Verbose info: ${SOME_VAR}")

# 条件警告
if(NOT SOME_REQUIRED_VAR)
    message(WARNING "SOME_REQUIRED_VAR is not set!")
endif()

# 致命错误
if(NOT CMAKE_CXX_COMPILER)
    message(FATAL_ERROR "C++ compiler is required!")
endif()

5.3 变量检查

include(CMakePrintHelpers)
cmake_print_variables(CMAKE_CXX_COMPILER CMAKE_BUILD_TYPE)

📦 六、模块化与代码复用

6.1 项目结构最佳实践

project/
├── CMakeLists.txt              # 根配置
├── CMakePresets.json           # 预设配置
├── cmake/                      # 自定义模块
│   ├── FindCustomLib.cmake
│   └── ProjectConfig.cmake.in
├── src/
│   ├── CMakeLists.txt
│   ├── core/
│   └── app/
├── include/
├── tests/
│   └── CMakeLists.txt
└── third_party/

6.2 子目录模块化

# 根 CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(MyProject VERSION 1.0.0)

# 添加子项目
add_subdirectory(src/core)
add_subdirectory(src/app)

# 条件添加测试
option(BUILD_TESTS "Build tests" ON)
if(BUILD_TESTS)
    enable_testing()
    add_subdirectory(tests)
endif()

6.3 导出配置供外部使用

# 安装时导出目标
install(TARGETS mylib myapp
    EXPORT MyProjectTargets
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    RUNTIME DESTINATION bin
)

# 生成配置文件
install(EXPORT MyProjectTargets
    FILE MyProjectTargets.cmake
    NAMESPACE MyProject::
    DESTINATION lib/cmake/MyProject
)

# 生成版本配置
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/MyProjectConfigVersion.cmake"
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY SameMajorVersion
)

# 安装配置文件
install(FILES
    cmake/MyProjectConfig.cmake
    "${CMAKE_CURRENT_BINARY_DIR}/MyProjectConfigVersion.cmake"
    DESTINATION lib/cmake/MyProject
)

⚡ 七、性能优化特性

7.1 并行构建

# 使用 Ninja 生成器(推荐)
cmake -G Ninja ..
cmake --build . -j$(nproc)

# 或 Makefile 并行
cmake --build . --parallel 8

7.2 链接时优化(LTO)

include(CheckIPOSupported)
check_ipo_supported(RESULT lto_supported OUTPUT lto_output)

if(lto_supported)
    set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
    message(STATUS "LTO enabled")
else()
    message(WARNING "LTO not supported: ${lto_output}")
endif()

7.3 预编译头文件

target_precompile_headers(myapp PRIVATE
    <iostream>
    <vector>
    <string>
    "common.h"
)

🛠️ 八、高级特性速查表

特性 最低版本 说明
CMake Presets 3.19 JSON 预设配置
FetchContent 3.11 在线依赖获取
target_precompile_headers 3.16 预编译头文件
check_ipo_supported 3.9 LTO 支持检测
Generator Expressions 3.0+ $<CONFIG:Debug>
Object Libraries 2.4+ 对象库复用
Imported Targets 3.0+ 导入目标 :: 命名空间

8.1 生成器表达式示例

# 条件编译选项
target_compile_options(myapp PRIVATE
    $<$<CONFIG:Debug>:-g -O0>
    $<$<CONFIG:Release>:-O3>
)

# 平台特定设置
target_compile_definitions(myapp PRIVATE
    $<$<PLATFORM_ID:Windows>:WIN32>
    $<$<PLATFORM_ID:Linux>:LINUX>
)

# 编译器特定
target_compile_options(myapp PRIVATE
    $<$<CXX_COMPILER_ID:GNU>:-Wall -Wextra>
    $<$<CXX_COMPILER_ID:MSVC>:/W4>
)

📚 九、推荐资源

资源 链接
官方文档 https://cmake.org/documentation/
CMake Presets 指南 https://cmake.org/cmake/help/latest/manual/cmake-presets.7.html
现代 CMake 最佳实践 https://cliutils.gitlab.io/modern-cmake/
CMake 教程 https://cmake.org/cmake/help/latest/guide/tutorial/index.html

如需了解某个特定高级特性的详细用法,欢迎继续提问!

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐