CMake | include_guard命令详解
目录
一、命令详解
二、简单使用
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命令详解相关推荐
- cmake(8):install命令详解
1. 说明 之前的示例中有提到使用cmake的install命令来自动安装库和头文件,但是只是使用到了install命令很基础很少的部分,其实该命令作用十分丰富,本篇文档用于说明该命令的详细使用方法. ...
- nmcli命令详解_【高新课堂】第一百二十五期Liunx必备命令
点击上方"蓝字"关注我们吧! Liunx系统启动默认为字符界面,一般不会启用图像界面,所以对命令行的熟练程度能更加高效.便捷的管理Liunx服务器. 这节课向读者介绍Liunx系统 ...
- Android自动化测试环境部署及adb sdkmanager avdmanager Monitor DDMS工具使用及命令详解
环境部署及工具使用 系列文章 前言 环境部署 硬件环境 软件环境 ADB工具 adb组成 adb命令 android命令 sdkmanager 命令 avdmanager命令 管理模拟器 monito ...
- docker常用命令详解
docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...
- oracle home 命令,$ORACLE_HOMEbin目录下所有命令的使用方法及命令详解
求$ORACLE_HOME/bin目录下所有命令的使用方法及命令详解 如题. $ORACLE_HOME/bin目录下有很多命令,那我们平时用到的也不是太多,即使用到的那部分可能用法也不是完全能掌握,所 ...
- 【FFmpeg】ffmpeg命令详解(三)高级选项
ffmpeg命令详解(三)高级选项 1.-map 2.-ignore_unknown 3.-copy_unknown 4.-map_channel 5.-map_metadata 6.-map_cha ...
- 【FFmpeg】ffmpeg命令详解(二)
ffmpeg命令详解(二) 4.流选择 4.1 自动选择流 4.2 手动选择流 5.命令行选择详解 5.1 命令行选项的值说明: 5.2 流说明符 5.3 通用选项 5.4 主选项 5.5 视频相关选 ...
- 【FFmpeg】ffmpeg命令详解(一)
ffmpeg命令详解(一) 1.命令格式 2.简述 3.详细说明 3.1 过滤器 3.1.1 简单的过滤器图 3.1.2 复杂的过滤器图 3.2 流拷贝 1.命令格式 ffmpeg [global_o ...
- head和tail命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/amosli/p/3496027.html 当要查看上千行的大文件时,我们可不会用cat命令把整个文件内容给打印出来,相 ...
最新文章
- 棋盘格检测--Automatic camera and range sensor calibration using a single shot
- 解决element-ui表头错位的问题
- eureka之EurekaInstanceConfig接口的作用
- Excel酷炫技能,批量修改工作表名称,让你的工作事半功倍
- 人工智能免费学习!想了解的进来看看
- python运维开发之第九天
- 程序员面试金典——7.5平分的直线
- Oracle卸载方法
- android 电话号码,Android中的电话号码自动格式化
- FFmpeg录制视频黑屏
- APP上架需要准备的材料清单(上架规范和流程)
- 快递鸟智选物流API接口平台对接分享实例
- 为什么要做用户行为分析?
- 12个最好的开源报表工具
- GIMP 快速入门(2)
- docker pull报错:Timeout exceeded while awaiting headers解决思路
- 听说你,对薪酬待遇不太满意 . . . .
- 烂泥:wiki系统confluence5.6.6安装、中文、破解及迁移
- 糊里糊涂违背了规则,硅胶制品很是懊悔
- 【操作系统】操作系统知识点整理;C++ 实现线程池与windows 线程池的使用;