目录

一、命令详解

二、简单使用

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. 项目管理风险控制及注意事项
  2. 实现一个压缩Remoting传输数据的Sink:CompressionSink
  3. 被忽视的ArrayList,你知道多少
  4. 程序员,你可以更优秀些!加油!
  5. dj鲜生-36-商品应用-其它模型类的创建-完善goods应用的数据表
  6. (26)ESLint一JS代码格式校验
  7. 指针java_浅谈Java与指针 - 穿梭于偶然
  8. SSM后台框架下配合实现小程序图片上传至阿里云OOS
  9. 学python lesson3
  10. MCSA 70-740 windows存储相关的基本概念
  11. python爬取企业电话_Python爬取天眼查企业数据
  12. java对象复制_Java对象的复制三种方式
  13. sofa-seata
  14. 卸载office提示无法打开修补程序包 修补程序包是否存在的解决方法.
  15. 程序员谨防加班猝死的十大建议
  16. Unknown rule function-calc-no-invalid.Stylelint(function-calc-no-invalid)
  17. 如何将网站上传到服务器空间,如何使用FTP工具将网站上传到虚拟主机空间
  18. 干货|认识kata-containers
  19. 什么是最好的UML在线免费软件
  20. 小程序毕设作品之微信积分商城小程序毕业设计成品(1)开发概要

热门文章

  1. 智能车八邻域图像算法
  2. wilcoxon符号秩检验matlab,Wilcoxon符号秩统计量的性质.ppt
  3. 教老婆学java系列之奇妙的数据结构四
  4. 《海洋测绘》:从地方坐标系到2000国家大地坐标系的转换方法
  5. 古时候的汉法,现代社会的红光光浴-种光光学
  6. 较全的协同OA系统功能需求
  7. 关闭WIN7交互式服务检测提示
  8. 韩商言房子卖价有多高,做现女友就有多难?
  9. Cisco ❀ IPV4协议数据报头部
  10. 我越脱俗,就会越世俗