目录

一、命令详解

二、简单使用

1.CMakeLists.txt

2.cmake/custom.cmake

3.配置

三、为低于3.10的版本自定义“包含保护”机制

1.cmake变量介绍

(1)CMAKE_CURRENT_LIST_FILE

2.修改CMakeLists.txt

3.cmake/my_module.cmake

4.配置


模块可能被include多次,为了避免多次包含一个模块,CMake从3.10版开始引入内置的 include_guard 命令,对于C/C++头文件,它的行为就像 #pragma 一样。

一、命令详解

include_guard([DIRECTORY|GLOBAL])

为CMake当前正在处理的文件提供包含保护,可选参数指定保护的范围:

  • DIRECTORY:include guard适用于当前目录及以下子目录。该文件只会在该目录范围内包含一次,但可能会被该目录以外的其他文件再次包含(即父目录或其他目录,而不是由当前文件或其子目录中的add_subdirectory()或include()拉入)。
  • GLOBAL:include guard适用于整个构建。无论范围如何,当前文件只包含一次。

二、简单使用

1.CMakeLists.txt

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(recipe-05 LANGUAGES NONE)include(cmake/custom.cmake)
#第二次包含
include(cmake/custom.cmake)

2.cmake/custom.cmake

message(STATUS "custom.cmake0")include_guard(GLOBAL)message(STATUS "custom.cmake1")

3.配置

如果当前文件已在适用范围内处理,则CMake将在include_guard()命令的位置结束对当前文件的处理。这提供了类似于源标题中常用的#pragma-once指令的功能。如果之前针对适用范围处理过当前文件,其效果就像调用了return( )。不要在当前文件定义的函数中调用include_guard命令。

三、为低于3.10的版本自定义“包含保护”机制

1.cmake变量介绍

(1)CMAKE_CURRENT_LIST_FILE

当前正在处理的列表文件的完整路径。

在CMake处理项目中的列表文件时,此变量将始终设置为当前正在处理的变量。该值具有动态范围。当CMake开始处理源文件中的命令时,它会将此变量设置为文件的位置。当CMake处理完文件中的命令后,它将恢复以前的值。因此,宏或函数中变量的值是调用调用堆栈最底层项的文件,而不是包含宏或函数定义的文件。

2.修改CMakeLists.txt

cmake_minimum_required(VERSION 3.5 FATAL_ERROR)project(recipe-05 LANGUAGES NONE)#注意这行
include(cmake/my_module.cmake)include(cmake/custom.cmake)include(cmake/custom.cmake)

3.cmake/my_module.cmake

重新定义include_guard。

  • 在小于3.10的版本中,如果第一次调用宏,则 included_modules 变量没有定义,因此我们将其设置为空列表。然后检查 ${CMAKE_CURRENT_LIST_FILE} 是否是 included_modules 列表中的元素。如果是,则会发出警告;如果没有,我们将 ${CMAKE_CURRENT_LIST_FILE} 追加到这个列表。
  • CMake 3.10及更高版本的情况有所不同,我们会调用内置的 include_guard。
macro(include_guard)if(CMAKE_VERSION VERSION_LESS "3.10")message(STATUS "calling our custom include_guard")if(NOT DEFINED included_modules)set(included_modules)endif()if ("${CMAKE_CURRENT_LIST_FILE}" IN_LIST included_modules)message(WARNING "module ${CMAKE_CURRENT_LIST_FILE} processed more than once")else()list(APPEND included_modules ${CMAKE_CURRENT_LIST_FILE})endif()else()message(STATUS "calling the built-in include_guard")#_include_guard(${ARGV}) 指向内置的 include_guard,重新定义函数和宏_include_guard(${ARGV})message(STATUS "test")endif()
endmacro()

4.配置

当cmake版本小于3.10时:

当cmake版本大于3.10时:

CMake | include_guard命令详解相关推荐

  1. cmake(8):install命令详解

    1. 说明 之前的示例中有提到使用cmake的install命令来自动安装库和头文件,但是只是使用到了install命令很基础很少的部分,其实该命令作用十分丰富,本篇文档用于说明该命令的详细使用方法. ...

  2. nmcli命令详解_【高新课堂】第一百二十五期Liunx必备命令

    点击上方"蓝字"关注我们吧! Liunx系统启动默认为字符界面,一般不会启用图像界面,所以对命令行的熟练程度能更加高效.便捷的管理Liunx服务器. 这节课向读者介绍Liunx系统 ...

  3. Android自动化测试环境部署及adb sdkmanager avdmanager Monitor DDMS工具使用及命令详解

    环境部署及工具使用 系列文章 前言 环境部署 硬件环境 软件环境 ADB工具 adb组成 adb命令 android命令 sdkmanager 命令 avdmanager命令 管理模拟器 monito ...

  4. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  5. oracle home 命令,$ORACLE_HOMEbin目录下所有命令的使用方法及命令详解

    求$ORACLE_HOME/bin目录下所有命令的使用方法及命令详解 如题. $ORACLE_HOME/bin目录下有很多命令,那我们平时用到的也不是太多,即使用到的那部分可能用法也不是完全能掌握,所 ...

  6. 【FFmpeg】ffmpeg命令详解(三)高级选项

    ffmpeg命令详解(三)高级选项 1.-map 2.-ignore_unknown 3.-copy_unknown 4.-map_channel 5.-map_metadata 6.-map_cha ...

  7. 【FFmpeg】ffmpeg命令详解(二)

    ffmpeg命令详解(二) 4.流选择 4.1 自动选择流 4.2 手动选择流 5.命令行选择详解 5.1 命令行选项的值说明: 5.2 流说明符 5.3 通用选项 5.4 主选项 5.5 视频相关选 ...

  8. 【FFmpeg】ffmpeg命令详解(一)

    ffmpeg命令详解(一) 1.命令格式 2.简述 3.详细说明 3.1 过滤器 3.1.1 简单的过滤器图 3.1.2 复杂的过滤器图 3.2 流拷贝 1.命令格式 ffmpeg [global_o ...

  9. head和tail命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/amosli/p/3496027.html 当要查看上千行的大文件时,我们可不会用cat命令把整个文件内容给打印出来,相 ...

最新文章

  1. 棋盘格检测--Automatic camera and range sensor calibration using a single shot
  2. 解决element-ui表头错位的问题
  3. eureka之EurekaInstanceConfig接口的作用
  4. Excel酷炫技能,批量修改工作表名称,让你的工作事半功倍
  5. 人工智能免费学习!想了解的进来看看
  6. python运维开发之第九天
  7. 程序员面试金典——7.5平分的直线
  8. Oracle卸载方法
  9. android 电话号码,Android中的电话号码自动格式化
  10. FFmpeg录制视频黑屏
  11. APP上架需要准备的材料清单(上架规范和流程)
  12. 快递鸟智选物流API接口平台对接分享实例
  13. 为什么要做用户行为分析?
  14. 12个最好的开源报表工具
  15. GIMP 快速入门(2)
  16. docker pull报错:Timeout exceeded while awaiting headers解决思路
  17. 听说你,对薪酬待遇不太满意 . . . .
  18. 烂泥:wiki系统confluence5.6.6安装、中文、破解及迁移
  19. 糊里糊涂违背了规则,硅胶制品很是懊悔
  20. 【操作系统】操作系统知识点整理;C++ 实现线程池与windows 线程池的使用;

热门文章

  1. Unity3D中删除指定路径的文件+删除文件夹
  2. 阿里飞冰使用教程-前端低代码可视化GUI速开发
  3. 二期:Combined Scorecards
  4. MySQL 的安装与启动
  5. Flutter TextField 去掉下滑线和底部字符数计数
  6. 如何打造高端的数据报表?
  7. 零基础应该怎么学习商业插画?
  8. EXCEL中定义名称
  9. scala特质 对比java的接口 使用方法
  10. 花生壳 linux客户端 命令