CMake 属性之目录属性
【写在前面】
CMake 的目录属性是指在特定目录(及其子目录)范围内有效的设置。
这些属性不同于全局变量或目标(Target)属性,它们提供了一种机制,允许开发者为项目中的不同部分定义不同的构建行为。
通过目录属性,你可以指定编译器选项、包含路径、预处理定义等,而无需在每个目标或文件中重复这些设置。
【正文开始】
CMake 目录范围的属性有( CMake 3.30 ):
- ADDITIONAL_CLEAN_FILES
- BINARY_DIR
- BUILDSYSTEM_TARGETS
- CACHE_VARIABLES
- CLEAN_NO_CUSTOM
- CMAKE_CONFIGURE_DEPENDS
- COMPILE_DEFINITIONS
- COMPILE_OPTIONS
- DEFINITIONS
- EXCLUDE_FROM_ALL
- IMPLICIT_DEPENDS_INCLUDE_TRANSFORM
- IMPORTED_TARGETS
- INCLUDE_DIRECTORIES
- INCLUDE_REGULAR_EXPRESSION
- LABELS
- LINK_DIRECTORIES
- LINK_OPTIONS
- LISTFILE_STACK
- MACROS
- PARENT_DIRECTORY
- RULE_LAUNCH_COMPILE
- RULE_LAUNCH_CUSTOM
- RULE_LAUNCH_LINK
- SOURCE_DIR
- SUBDIRECTORIES
- SYSTEM
- TESTS
- TEST_INCLUDE_FILES
- VARIABLES
- VS_GLOBAL_SECTION_POST_<section>
- VS_GLOBAL_SECTION_PRE_<section>
- VS_STARTUP_PROJECT
定义目录属性:
define_property( <DIRECTORY>PROPERTY <name> [INHERITED][BRIEF_DOCS <brief-doc> [docs...]][FULL_DOCS <full-doc> [docs...]][INITIALIZE_FROM_VARIABLE <variable>])在范围内定义一个属性,用于 set_property() 和 get_property() 命令。它主要用于定义属性的初始化或继承方式。从历史上看,该命令还将文档与属性相关联,但这不再被视为主要用例。
示例:
# 定义一个名为 CURRENT_DIRECTORY 的目录属性
define_property(DIRECTORY # 目录属性的名称PROPERTY CURRENT_DIRECTORY# 简短的文档说明BRIEF_DOCS "The current directory"# 详细的文档说明FULL_DOCS "The current directory"
)
设置目录属性:
set_property(<[DIRECTORY <dirs> ...] [TARGET_DIRECTORY <targets> ...]>[APPEND] [APPEND_STRING]PROPERTY <name> [<value1> ...])在范围的零个或多个对象上设置一个属性。
DIRECTORY 范围默认为当前目录,但其他目录(已由 CMake 处理)可以按完整路径或相对路径命名。相对路径被视为相对于当前源目录。另请参阅 set_directory_properties() 命令。
在 3.19 版本加入:
<dir>
可以引用一个二进制目录。如果给出 APPEND 选项,列表将附加到任何现有的属性值(除了忽略和不附加空值)。如果给出 APPEND_STRING 选项,字符串将作为字符串附加到任何现有属性值,即它会产生更长的字符串而不是字符串列表。当使用 APPEND 或 APPEND_STRING 以及定义为支持 INHERITED 行为的属性时(请参阅 :command:define_property),在找到要附加到的初始值时不会发生继承。如果该属性尚未在指定范围内直接设置,则该命令的行为就好像没有给出 APPEND 或 APPEND_STRING 一样。
示例:
# 设置当前目录属性为当前源代码目录
set_property(DIRECTORY PROPERTY CURRENT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
其中,有一个专用于设置目录属性的命令:
set_directory_properties(PROPERTIES prop1 value1 [prop2 value2] ...)在键值对中设置当前目录及其子目录的属性。
另请参阅 set_property(DIRECTORY) 命令。
获取目录属性:
get_property(<[DIRECTORY <dir> | TARGET_DIRECTORY <target>]>PROPERTY <name>[SET | DEFINED | BRIEF_DOCS | FULL_DOCS])从范围内的一个对象获取一个属性。
DIRECTORY 作用域默认为当前目录,但另一个目录(已由 CMake 处理)可能由完整或相对路径命名为“<dir>”。相对路径被视为相对于当前源目录。另请参阅 get_directory_property() 命令。
在 3.19 版本加入:
<dir>
可以引用一个二进制目录。如果给出了 SET 选项,变量将被设置为一个布尔值,指示该属性是否已被设置。如果给出了 DEFINED 选项,变量将被设置为一个布尔值,指示该属性是否已被定义,例如使用 define_property 命令。 如果给出了``BRIEF_DOCS`` 或``FULL_DOCS``,那么该变量将被设置为一个字符串,其中包含所请求属性的文档。如果为尚未定义的属性请求文档,则返回“NOTFOUND”。
示例:
# 获取当前目录属性
get_property(CURRENT_DIR DIRECTORY PROPERTY CURRENT_DIRECTORY)
其中,有一个专用于获取目录属性的命令:
get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)将目录范围的属性存储在命名的``<variable>``中。
DIRECTORY
参数指定从中检索属性值的另一个目录,而不是当前目录。相对路径被视为相对于当前源目录。 CMake 必须已经知道该目录,或者通过调用 add_subdirectory 添加它或者是顶级目录。在 3.19 版本加入:
<dir>
可以引用一个二进制目录。如果没有为指定的目录范围定义该属性,则返回一个空字符串。对于
INHERITED
属性,如果在指定的目录范围内找不到该属性,则搜索将链接到父范围,如 define_property() 命令所述。get_directory_property(<variable> [DIRECTORY <dir>]DEFINITION <var-name>)从目录中获取变量定义。这种形式对于从另一个目录获取变量定义很有用。
示例:
# 添加预处理定义,定义宏TEST_DEFINED的值为1
add_compile_definitions(TEST_DEFINED=1)# 获取当前目录的属性COMPILE_DEFINITIONS,即定义的宏
get_directory_property(DEFS COMPILE_DEFINITIONS) # 打印获取到的定义信息
message("DEFS: ${DEFS}")
最后完整测试一遍:
# 要求 CMake 最低版本为 3.16
cmake_minimum_required(VERSION 3.16)# 定义一个名为 CURRENT_DIRECTORY 的目录属性
define_property(DIRECTORY # 目录属性的名称PROPERTY CURRENT_DIRECTORY# 简短的文档说明BRIEF_DOCS "The current directory"# 详细的文档说明FULL_DOCS "The current directory"
)# 设置当前目录属性为当前源代码目录
set_property(DIRECTORY PROPERTY CURRENT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})# 获取当前目录属性
get_property(CURRENT_DIR DIRECTORY PROPERTY CURRENT_DIRECTORY)# 打印当前目录信息
message("CURRENT_DIR: ${CURRENT_DIR}")# 添加预处理定义,定义宏TEST_DEFINED的值为1
add_compile_definitions(TEST_DEFINED=1)# 获取当前目录的属性COMPILE_DEFINITIONS,即定义的宏
get_directory_property(DEFS COMPILE_DEFINITIONS) # 打印获取到的定义信息
message("DEFS: ${DEFS}")# 将库目录链接到当前目录下的lib目录
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)# 获取链接目录属性
get_property(LINK_DIR DIRECTORY PROPERTY LINK_DIRECTORIES)# 获取源目录属性
get_property(S_DIR DIRECTORY PROPERTY SOURCE_DIR)# 打印链接目录和源目录信息
message("LINK_DIR: ${LINK_DIR} S_DIR: ${S_DIR}")# 设置当前目录及其子目录的编译器标志
set_directory_properties(PROPERTIES COMPILE_FLAGS "-Wall -Wextra")# 获取当前目录的编译标志
get_directory_property(COMPILE_FLAGS COMPILE_FLAGS)# 打印获取到的编译标志信息
message("COMPILE_FLAGS: ${COMPILE_FLAGS}")
CMake 输出如下:
【结语】
项目链接(多多star呀..⭐_⭐):
Github 地址:https://github.com/mengps/LearnCMake
相关文章:

CMake 属性之目录属性
【写在前面】 CMake 的目录属性是指在特定目录(及其子目录)范围内有效的设置。 这些属性不同于全局变量或目标(Target)属性,它们提供了一种机制,允许开发者为项目中的不同部分定义不同的构建行为。 通过目录…...

ChatGPT:引领人工智能新潮流!
一、ChatGPT 是什么? 1. ChatGPT 的强大功能和广泛应用。 ChatGPT 作为一款先进的 AI 语言模型,拥有众多强大功能。它可以进行文本生成、文本分类、情感分析、机器翻译等多种自然语言处理任务。同时,ChatGPT 还能进行对话式交互,…...

【银河麒麟高级服务器操作系统】安全配置基线相关分析全过程及解决方案
了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 服务器环境以及配置 【机型】物理机或虚机 【…...
用Python实现图片转ASCII艺术:图像处理与字符艺术的完美结合
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 ASCII艺术是一种通过字符来表现图像的艺术形式,最早用于早期计算机显示器,它仅支持字符显示。如今,尽管图像分辨率和显示技术得到了极大的提升,ASCII艺术作为一种复古而别具一格的图像表现形式,仍然受到许多…...

大数据-162 Apache Kylin 全量增量Cube的构建 Segment 超详细记录 多图
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

Redis-缓存过期淘汰策略
缓存淘汰策略 生产上redis内存设置为多少 设置为最大内存的 3/4 redis 会占用物理机多少内存 默认大小是 0,64 位系统下表示不限制内存大小,32位系统表示 3G 如何设置修改redis内存大小 config get maxmemory 查看修改方式 配置文件 单位是字节 2.…...

如何设置LED电子显示屏的屏幕参数?
LED电子显示屏因其高亮度、低能耗和长寿命等优点,在广告、信息显示等领域得到了广泛应用。正确设置屏幕参数对于确保显示屏的最佳性能至关重要。以下是LED电子显示屏设置屏幕参数的步骤: 1. 确定屏幕参数 在开始设置之前,需要了解显示屏的基本…...

Spring Boot Starter Parent介绍
引言 spring-boot-starter-parent 是一个特殊的项目,为基于 Spring Boot 的应用程序提供默认配置和默认依赖。 在本 Spring Boot 教程中,我们将深入了解所有 Spring Boot 项目内部使用的 spring-boot-starter-parent 依赖项。我们将探讨此依赖项所提供…...

【含开题报告+文档+PPT+源码】基于SpringBoot乡村助农益农平台的设计与实现
开题报告 近年来,随着社会经济的快速发展和人民生活水平的提高,人们对优质农产品的需求越来越高。然而,传统的农产品销售管理模式存在一些问题。首先,农产品供应链信息不透明,导致生产者难以了解市场需求和价格变动趋…...

数据中心运维挑战:性能监控的困境与智能化解决方案的探寻
随着数字化进程的加速,数据中心已成为企业信息架构的核心支撑,其运维管理的复杂度和重要性也随之提升。运维团队需应对设备老化、资源分配失衡、性能波动等多重难题,以确保数据中心持续高效运行。 其中,性能监控作为运维管理的关键…...

基于SSM的民宿管理系统【附源码】
基于SSM的民宿管理系统(源码L文说明文档) 目录 4 系统设计 4.1 系统概要设计 4.2 系统功能结构设计 4.3 数据库设计 4.3.1 数据库E-R图设计 4.3.2 数据库表结构设计 5 系统实现 5.1用户信息管理 5.2 房东信息管理…...

显卡 3090 vs v100
1.3090 Date: 2020 AmperePielines/ Cuda cores: 10496 2.V100 Date: 2018 VoltaPielines/ Cuda cores: 5129 3.结构 & Core比较: v100优点: v100功耗小v100较快的双精度(fp64)和混合精度(fp16fp32)pcie版的NVLink与2080ti完全一致 v100缺点: 不支持整数格式计算&…...

怎么在单片机裸机程序中移植EasyLogger?
1、介绍 EasyLogger 是一款超轻量级、高性能的C日志库,非常适合对资源敏感的软件项目。例如:IoT产品、可穿戴设备、智能家居等等。相比log4c、zlog这些知名的C日志库,EasyLogger的功能更加简单,提供给用户的接口更少,但…...
C/C++解析文件名和目录路径
文章目录 主要函数使用注意事项示例程序总结 #include <libgen.h> 是一个 C/C 语言的头文件,主要用于字符串处理,特别是在处理文件路径时。它提供了一些函数来帮助你解析文件名和目录路径。 主要函数 以下是 libgen.h 中一些常见的函数ÿ…...
Git 基本命令行操作
Git是一个开源的分布式版本控制系统,用于管理源代码和文档的版本。以下是Git的基本命令行操作: 一、配置 安装完成后,需要配置Git的用户名和邮箱,以便在提交记录时记录操作者的信息。 配置全局用户名:git config --g…...
【Rust练习】17.泛型
练习题来自:https://practice-zh.course.rs/generics-traits/generics.html 函数 1 // 填空 struct A; // 具体的类型 A. struct S(A); // 具体的类型 S. struct SGen<T>(T); // 泛型 SGen.fn reg_fn(_s: S) {}fn gen_spec_t(_s: SGen<A&…...

java脚手架系列4--测试用例、拦截器
异常处理、拦截器、数据库连接 1 测试用例 单元测试是一个老生常谈的问题,无论是后端对自己的代码质量把的第一道关也好,也是对测试减缓压力。这里就不过多讲述测试用例的重要性,但是有2个框架我们必须了解一下。 1.1 JUnit和mockito 我们…...
论文推荐 |【Agent】自动化Agent设计系统
论文标题: Automated Design of Agentic Systems 论文地址: https://arxiv.org/abs/2408.08435 GitHub地址: https://github.com/ShengranHu/ADAS 自动化代理设计在性能和通用性方面显著超越了手动方法。 • 引入了自动化代理系统设计&am…...
Linux操作系统提供了五种主要的IO(输入/输出)模型
Linux操作系统提供了五种主要的IO(输入/输出)模型,这些模型旨在优化应用程序对输入输出操作的管理和处理。以下是关于这五种IO模型的详细介绍。 一、阻塞IO(Blocking IO) 阻塞IO是最常见、最传统的IO模型。在这种模型…...

基于深度学习的花卉识别系统
简介: 基于Python的花卉识别分类系统利用深度学习和计算机视觉技术,能够准确识别和分类各种花卉,如玫瑰、郁金香和向日葵等。这种系统不仅有助于植物学研究和园艺管理,还在生态保护、智能农业和市场销售等领域展现广泛应用前景。随…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...