CMake中set_property接口及属性作用详解
在 CMake 中,set_property 是一个用于设置 属性(Property) 的核心命令。属性是 CMake 中用于控制构建过程的核心机制之一,可以理解为与特定对象(如目标、目录、源文件等)关联的键值对,用于存储配置信息或影响构建行为。
Property(属性)的作用和含义
-
属性的本质:
- 属性是附加到 CMake 管理的各种实体(如目录、目标、源文件、测试等)上的元数据。
- 它们可以控制 CMake 生成构建系统时的行为,例如:
- 目标的编译选项(如
COMPILE_OPTIONS) - 链接库(如
LINK_LIBRARIES) - 源文件的特定属性(如
HEADER_FILE_ONLY) - 全局属性(如
CMAKE_BUILD_TYPE)
- 目标的编译选项(如
-
属性的作用域:
- 全局属性(
GLOBAL):对整个项目有效。 - 目录属性(
DIRECTORY):对当前目录及子目录有效。 - 目标属性(
TARGET):针对特定目标(如可执行文件或库)。 - 源文件属性(
SOURCE):针对某个源文件(如.cpp)。 - 测试属性(
TEST):针对 CTest 测试用例。
- 全局属性(
-
属性的继承性:
- 某些属性会被子目录或子目标继承(如目录的
INCLUDE_DIRECTORIES),但并非所有属性都有继承性。
- 某些属性会被子目录或子目标继承(如目录的
set_property 的用法
set_property 的基本语法如下:
set_property(<SCOPE> [<目标或路径>] PROPERTY <属性名> <值>)
参数解释:
-
<SCOPE>:指定属性的作用域,可以是以下之一:GLOBAL:全局属性。DIRECTORY [dir]:目录属性(默认当前目录)。TARGET <target>:目标属性。SOURCE <source>:源文件属性。TEST <test>:测试属性。CACHE <entry>:CMake 缓存条目属性。
-
PROPERTY <属性名>:要设置的属性名称。- 常见的属性名如
INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS、LINK_LIBRARIES等。 - 可通过
cmake --help-property-list查看所有支持的属性。
- 常见的属性名如
-
<值>:属性的具体值,可以是列表或单个值。
示例场景
1. 设置目标属性
add_executable(my_app main.cpp)# 设置目标的 C++ 标准为 C++17
set_property(TARGET my_app PROPERTY CXX_STANDARD 17)# 为目标添加自定义编译选项
set_property(TARGET my_app PROPERTY COMPILE_OPTIONS "-Wall;-Wextra")
2. 设置目录属性
# 为当前目录添加包含路径
set_property(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "/path/to/include")# 设置目录的编译定义
set_property(DIRECTORY PROPERTY COMPILE_DEFINITIONS "DEBUG_MODE=1")
3. 设置全局属性
# 设置全局属性,例如自定义变量
set_property(GLOBAL PROPERTY MY_GLOBAL_VAR "some_value")
4. 设置源文件属性
# 标记某个源文件为头文件(不参与编译)
set_property(SOURCE header.h PROPERTY HEADER_FILE_ONLY TRUE)
如何理解 set_property 与其他命令的关系?
CMake 提供了更简洁的命令(如 target_include_directories 或 target_compile_options)来设置常见属性,它们的底层可能直接操作属性。例如:
target_include_directories(my_app PUBLIC "/path/to/include")
等价于:
set_property(TARGET my_app APPEND PROPERTY INCLUDE_DIRECTORIES "/path/to/include")
但 set_property 更灵活,可以操作所有属性(包括自定义属性)。
关键点总结
- 属性的核心作用:通过键值对控制 CMake 构建的细节。
set_property的灵活性:可以操作任意作用域和属性,适合需要精确控制的场景。- 优先使用高层命令:对于常见需求(如设置编译选项),优先使用
target_*系列命令,代码更简洁。
如果需要进一步调试属性,可以使用 get_property 读取属性值。
用户问的是CMake里的set_property这个接口是用来做什么的,还有property的作用和含义应该怎么理解。首先,我得回忆一下CMake中property的概念。记得CMake里的属性(property)是用来存储各种配置信息的,比如目标的编译选项、源文件的属性、目录的属性等等。这些属性可以影响构建过程的不同方面。
那set_property这个命令,应该就是用来设置这些属性的。用户可能需要知道它的基本用法,比如如何指定作用域(比如全局、目录、目标、源文件等),以及如何设置属性名和值。可能需要举几个例子说明不同的应用场景,比如设置目标的包含目录,或者设置某个源文件的编译选项。
然后,用户可能对property的作用不太清楚,需要解释属性是如何在CMake中传递信息和控制构建行为的。比如,每个目标(target)都有一些内置属性,比如INCLUDE_DIRECTORIES、COMPILE_DEFINITIONS等,而set_property可以用来修改这些属性,从而改变构建时的行为。
另外,用户可能想知道set_property和其他类似命令(比如set_target_properties、set_directory_properties)之间的区别。set_property更通用,可以在不同的作用域下设置属性,而其他命令可能是针对特定作用域的简化版。
还要注意,property可以是全局的,也可以是特定于某个目标的,或者是目录、测试等其他实体的。需要解释不同的作用域类型(GLOBAL、DIRECTORY、TARGET、SOURCE、TEST、CACHE、INSTALL),以及它们适用的场景。
可能用户在使用时遇到了问题,比如不知道如何正确设置属性,或者属性没有生效,这时候需要强调作用域的重要性,确保在正确的上下文中设置属性。例如,设置目标的属性时,需要确保目标已经被创建(即add_executable或add_library之后)。
另外,属性的继承和覆盖关系也需要解释清楚。比如,某些属性可能会被子目录继承,而有些则是独立的。可能需要提到CMake的变量作用域和属性作用域之间的区别,属性更持久,不受函数或子目录的影响,除非显式设置。
最后,总结一下set_property的作用,即通过设置不同作用域下的属性,来精确控制构建过程中的各种配置,是CMake灵活配置的重要组成部分。需要给出一个或多个具体的例子,帮助用户理解如何在实际项目中应用这个命令。
是的!get_property 是 set_property 的对应命令,用于读取属性值。它们在 CMake 中共同构成了对属性(Property)的“写”和“读”操作。理解它们的配合使用,能帮助你更灵活地控制 CMake 的构建逻辑,尤其是在需要动态判断或调试属性时。
get_property 的基本用法
get_property 的语法如下:
get_property(<变量名> <SCOPE> [<目标或路径>] PROPERTY <属性名> [DEFINED | SET | BRIEF_DOCS | FULL_DOCS])
关键参数:
<变量名>:存储读取结果的变量。<SCOPE>:属性的作用域(和set_property一致),如GLOBAL、DIRECTORY、TARGET、SOURCE、TEST。PROPERTY <属性名>:要读取的属性名称。- 可选参数:
DEFINED:检查属性是否已定义(返回布尔值)。SET:检查属性是否有值(返回布尔值)。BRIEF_DOCS/FULL_DOCS:获取属性的文档描述(调试用)。
典型场景示例
1. 读取目标属性
add_executable(my_app main.cpp)
set_property(TARGET my_app PROPERTY CXX_STANDARD 17)# 读取目标的 C++ 标准设置
get_property(cxx_std TARGET my_app PROPERTY CXX_STANDARD)
message("C++ Standard for my_app: ${cxx_std}") # 输出:17
2. 检查全局属性是否存在
set_property(GLOBAL PROPERTY MY_GLOBAL_FLAG "ON")# 检查属性是否定义
get_property(is_defined GLOBAL PROPERTY MY_GLOBAL_FLAG DEFINED)
if(is_defined)message("MY_GLOBAL_FLAG 已定义!")
endif()
3. 读取目录的包含路径
set_property(DIRECTORY PROPERTY INCLUDE_DIRECTORIES "/usr/include/mylib")# 获取当前目录的包含路径
get_property(inc_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
message("包含路径:${inc_dirs}") # 输出:/usr/include/mylib
4. 动态判断并修改属性
# 如果某个目标的编译选项包含 "-Wall",则追加 "-Werror"
get_property(opts TARGET my_app PROPERTY COMPILE_OPTIONS)
if("-Wall" IN_LIST opts)target_compile_options(my_app PRIVATE -Werror)
endif()
常见问题与技巧
1. 作用域必须匹配
- 读取属性时,作用域(
SCOPE)必须与设置时一致。例如:# 错误!作用域应为 TARGET,不是 DIRECTORY get_property(val DIRECTORY PROPERTY CXX_STANDARD) # 正确 get_property(val TARGET my_app PROPERTY CXX_STANDARD)
2. 处理列表类型的属性
- 许多属性是列表类型(如
COMPILE_OPTIONS、INCLUDE_DIRECTORIES),读取后可以直接用foreach或IN_LIST操作:get_property(srcs TARGET my_app PROPERTY SOURCES) foreach(src IN LISTS srcs)message("源文件:${src}") endforeach()
3. 调试属性
- 使用
message打印属性值,是调试 CMake 脚本的重要手段:get_property(link_libs TARGET my_lib PROPERTY LINK_LIBRARIES) message("链接库:${link_libs}")
4. 自定义属性
- 你可以为任意对象设置自定义属性,用于存储项目特定的元数据:
# 设置自定义属性 set_property(TARGET my_app PROPERTY MY_CUSTOM_TAG "optimized")# 读取自定义属性 get_property(tag TARGET my_app PROPERTY MY_CUSTOM_TAG)
set_property vs get_property 对比
| 操作 | 命令 | 用途 |
|---|---|---|
| 写属性 | set_property | 设置属性值(直接覆盖或追加) |
| 读属性 | get_property | 读取属性值或检查属性状态 |
高级用法:属性传递与继承
CMake 中某些属性具有继承性(如目录的 INCLUDE_DIRECTORIES),而其他属性(如目标的 COMPILE_OPTIONS)需要显式传递(通过 PUBLIC/PRIVATE/INTERFACE)。通过 get_property 可以观察继承链中的属性值。
总结
get_property的核心作用:读取属性值或检查属性状态。- 适用场景:
- 调试构建过程中的属性值。
- 动态逻辑判断(根据属性值调整构建行为)。
- 操作自定义属性。
- 优先使用高层命令:如
target_sources、target_include_directories等更简洁,但get_property是底层调试和灵活控制的利器。
如果想查看所有支持的属性列表,可以运行:
cmake --help-property-list
用户刚才问到了set_property,现在他们提到对应的get_property,我应该继续解释这个命令。不过用户可能已经知道一些,但需要更深入的理解。让我先回忆一下用户的历史对话,之前他们询问了set_property的作用和属性概念,现在用户主动提到了get_property,这说明他们可能在使用过程中遇到了需要读取属性的情况,或者想更全面地了解属性的设置和获取。
用户可能的需求是,如何在CMake中获取已经设置的属性值,用于调试或者条件判断。他们可能遇到了构建过程中的问题,想通过检查属性值来定位错误。比如,他们可能在某个目标中设置了编译选项,但实际构建时没有生效,这时候需要确认属性是否正确设置。
接下来,我需要解释get_property的基本用法,和set_property的对应关系。同时,用户可能需要知道常见的应用场景,比如如何检查目录的包含路径,或者目标的链接库。此外,用户可能不太清楚作用域的问题,比如如何指定正确的范围来获取属性,或者是否需要处理列表值。
另外,用户可能对属性的继承性有疑问,比如子目录是否继承父目录的属性,或者目标属性如何影响源文件。这时候需要提到作用域的不同,比如GLOBAL、DIRECTORY、TARGET等,以及如何正确指定这些作用域来获取属性。
还需要注意,用户可能在尝试自定义属性,这时候get_property可以用来验证这些自定义属性是否被正确设置。例如,用户可能在项目中定义了一个全局变量,需要通过get_property来读取。
此外,用户可能不知道如何调试CMake脚本,使用message命令结合get_property来输出属性值,这样可以帮助他们理解构建过程中的变量状态。这时候需要给出具体的示例,比如如何获取目标的编译选项并打印出来。
可能还需要对比set_property和get_property的语法差异,强调作用域和属性名称的一致性。比如,设置属性时使用的TARGET作用域,在获取时也需要指定同样的作用域和目标名称。
还有,用户可能对属性的默认值不太清楚,如果属性未设置,get_property会返回什么?这时候需要说明变量可能不存在,或者值为空,以及如何处理这种情况,比如使用if语句检查是否存在。
最后,要提醒用户优先使用高层命令,如target_compile_options等,但理解get_property在底层的作用可以帮助他们更灵活地处理复杂情况。同时,确保他们知道如何查找所有支持的属性列表,比如通过cmake --help-property-list命令。
总结下来,用户需要的是get_property的详细说明,包括语法、作用域、示例,以及如何在实际项目中应用。同时,结合调试技巧和常见问题,帮助他们更好地使用这个命令来解决问题。
相关文章:
CMake中set_property接口及属性作用详解
在 CMake 中,set_property 是一个用于设置 属性(Property) 的核心命令。属性是 CMake 中用于控制构建过程的核心机制之一,可以理解为与特定对象(如目标、目录、源文件等)关联的键值对,用于存储配…...
设计模式——抽象工厂模式总结
理解了前面的工厂模式后,再理解抽象工厂模式就很容易了。 工厂模式:https://blog.csdn.net/inside802/article/details/147170118?spm1011.2415.3001.10575&sharefrommp_manage_link 抽象工厂模式就是工厂模式的更加抽象化,父类不仅不承…...
ChatGPT-如何让AI写作不那么生硬!
在使用聊天机器人撰写文章时,可能会遇到频繁使用“首先”、“其次”、“再次”等转折连接词,这会让文章显得呆板和机械,降低了阅读体验。 解决这个问题可以尝试以下方式! 多样化连接词: 使用更多多样的连接词和过渡短…...
禁止页面滚动的方法-微信小程序
在微信小程序中,有几种方法可以禁止页面滚动: 一、通过页面配置禁止滚动 在页面的JSON配置文件中设置,此方法完全禁止页面的滚动行为: {"disableScroll": true }二、通过 CSS 样式禁止滚动 在页面的WXSS文件中添加&…...
C++——继承、权限对继承的影响
目录 继承基本概念 编程示例 1.基类(父类)Person 代码特点说明 权限对类的影响 编辑 编程示例 1. 公有继承 (public inheritance) 2. 保护继承 (protected inheritance) 3. 私有继承 (private inheritance) 重要规则 实际应用 继承基本概…...
js中 剩余运算符(Rest Operator )(...)和展开运算符(Spread Operator)(...)的区别及用法
1、基本说明 在JavaScript中,剩余运算符(Rest Operator)和展开运算符(Spread Operator)虽然在某些方面有相似之处,但它们各自有不同的用途和功能。下面详细解释这两种运算符的区别: 1.1. 剩余…...
雅思练习总结(二十六)
雅思练习总结(二十六) 本文章是雅思练习总结(二十六),总结了文章《MAKING EVERYDROP COUNT》,内容包括原文精翻,文章脉络总结,单词扩展学习3个部分 1 文章原文及翻译 MAKING EVERYDROP COUNT 翻译:让每一滴水,都充满价值 A The history of human civilisation i…...
华为手机清理大数据的方法
清理手机最大的问题是,手动和自动清理了多次,花费了很长时间,但是只腾挪出来了一点点空间,还是有很大空间无法使用,这篇文章就告诉你怎样做,以花瓣剪辑为例,如下: 删除数据ÿ…...
单元测试原则之——不要过度模拟
什么是过度模拟? 过度模拟(over-mocking)是指在单元测试中,模拟了太多依赖项,甚至模拟了本不需要模拟的简单对象或行为。过度模拟会导致: 测试代码变得复杂,难以阅读和维护。测试逻辑偏离了实际业务逻辑,无法验证真实代码的行为。忽略了被测单元与依赖项之间的真实交互…...
操作系统基础:07 我们的任务
课程回顾与后续规划 上节课我们探讨了操作系统的历史。了解历史能让我们明智,从操作系统的发展历程中,我们总结出两个核心的里程碑式图像:多进程(多任务切换)图像和文件操作图像 。Unix和Windows等系统的成功…...
微服务的服务调用详解以及常见解决方案对比
微服务服务调用详解 1. 服务调用分类 服务调用根据通信方式、同步性、实现模式可分为以下类型: 按通信协议分类 类型典型协议/框架特点RPC(远程过程调用)Dubbo、gRPC、Apache Thrift高性能、二进制协议、强类型定义HTTP/RESTSpring RestTe…...
Verilog:LED呼吸灯
模块接口说明 信号方向描述clk输入系统时钟(100MHz,周期10ns)rst_n输入低电平有效的异步复位信号led_en输入总使能信号(1开启呼吸灯,0关闭)speed_en输入呼吸速度调节使能信号speed[2:0]输入呼吸速度分级&a…...
一个很好用的vue2在线签名组件
在前端开发的日常工作中,我们常常会遇到需要用户进行在线签名的需求,比如电子合同签署、表单确认等场景。最近,我在项目里使用了一款极为好用的 Vue2 在线签名组件,今天就来和大家分享一下使用心得。 效果图 上代码 在 views 下…...
C语言实现TcpDump
一、 在 C 语言中实现 TCP 抓包功能,通常可以使用 libpcap 库。libpcap 是一个广泛使用的网络抓包库,它提供了捕获网络数据包的接口。 libpcap 是一个广泛使用的 C 语言库,用于捕获和过滤网络数据包。它提供了一个通用接口,用于访…...
吴恩达深度学习复盘(14)迁移学习|项目基本周期
迁移学习 迁移学习是一种机器学习技术,它允许我们将从一个任务中学习到的知识应用到另一个相关的任务中。其核心思想在于,很多情况下,从头开始训练一个模型需要大量的数据和计算资源,而迁移学习能够复用在已有数据上训练好的模型…...
【STM32】STemWin库,使用template API
目录 CubeMX配置 工程文件配置 Keil配置 STemwin配置 GUIConf.c LCDConf.c 打点函数 修改屏幕分辨率 GUI_X.c 主函数 添加区域填充函数 移植过程中需要一些参考手册,如下 STemwin使用指南 emWin User Guide & Reference Manual CubeMX配置 参考驱…...
Matlab Add Legend To Graph-图例添加到图
Add Legeng To Graph: Matlab的legend()函数-图例添加到图 将图例添加到图 ,图例是标记绘制在图上的数据序列的有用方法。 下列示例说明如何创建图例并进行一些常见修改,例如更改位置、设置字体大小以及添加标题。您还可以创建具有多列的图…...
AI基础04-日志数据采集
上篇文章我们学习了视频的数据采集,今天主要了解一下日志数据采集的方法。日志数据采集的目的通常是:调试、运维监控和业务分析。调试主要是工程师在程序异常时针对关键环节把相关参数通过日志打印出来,找出哪个环节出现了问题。运维监控主要…...
文章记单词 | 第29篇(六级)
一,单词释义 AI /ˌeɪ ˈaɪ/ abbr. 人工智能(Artificial Intelligence)inventory /ˈɪnvəntri/ n. 存货清单;财产清单;库存货物;存货;v. 编制目录;开列清单;盘存cha…...
Arduino示例代码讲解:String substring() 字符串子链
Arduino示例代码讲解:String substring 字符串子链 String substring() 字符串子链程序功能概述功能:硬件要求:输出:代码结构`setup()` 函数`loop()` 函数创建字符串:提取子字符串:无限循环:运行过程代码输出解释原始字符串:提取子字符串:注意事项String substring() …...
2025年七星棋牌跨平台完整源码解析(200+地方子游戏+APP+H5+小程序支持,附服务器镜像导入思路)
目前市面上成熟的棋牌游戏源码很多,但能做到平台全覆盖、地方玩法丰富、交付方式标准化的系统却不多。今天这套七星棋牌2023完整源码具备安卓/iOS/H5/微信小程序端四端互通能力,附带200多款地方子游戏,还配备了后台管理与自动热更系统&#x…...
Odoo 部署本地 把現時的excel計算表格部署上odoo 教程
要将现有的 Excel 计算表格部署到 Odoo 平台上,您可以按照以下步骤进行操作: 将 Excel 表格中的数据转移到 Odoo 模块中:首先,您需要将 Excel 表格中的数据导出为 CSV 格式,然后可以使用 Odoo 的数据导入功能将这些数据…...
compose map 源码解析
目录 TileCanvas ZoomPanRotateState ZoomPanRotate 布局,手势处理完了,就开始要计算tile了 MapState TileCanvasState telephoto的源码已经分析过了.它的封装好,扩展好,适用于各种view. 最近又看到一个用compose写的map,用不同的方式,有点意思.分析一下它的实现流程与原…...
Go语言--语法基础4--基本数据类型--整数类型
整型是所有编程语言里最基础的数据类型。 Go 语言支持如下所示的这些整型类型。 需要注意的是, int 和 int32 在 Go 语言里被认为是两种不同的类型,编译器也不会帮你自动做类型转换, 比如以下的例子会有编译错误: var value2 in…...
mysql事务脏读 不可重复读 幻读 事务隔离级别关系
看了很多文档,发现针对事务并发执行过程中的数据一致性问题,即脏读、不可重复读、幻读的解释一塌糊涂,这也不能说什么,因为官方SQL标准中的定义也模糊不清。 按照mysql中遵循的事务隔离级别,可以梳理一下其中的关系 隔…...
智慧乡村数字化农业全产业链服务平台建设方案PPT(99页)
1. 农业全产业链概念 农业全产业链是依托数字化、电子商务、云计算等技术,整合规划咨询、应用软件设计与开发等服务,推动农业产业升级和价值重塑,构建IT产业融合新生态。 2. 产业链技术支撑 利用云计算、大数据、区块链等技术,为…...
信息系统项目管理师-软考高级(软考高项)2025最新(二)
个人笔记整理---仅供参考 第二章信息技术发展 2.1信息技术及其发展 2.1.1计算机软硬件 2.1.2计算机网络 2.1.3存储和数据库 2.1.4信息安全 公钥公开,私钥保密 2.1.5信息技术的发展 2.2新一代信息技术及应用 2.2.1物联网 2.2.2云计算 2.2.3大数据 2.2.4区块链 2.2.5…...
基于Springboot+Mysql的闲一品(含LW+PPT+源码+系统演示视频+安装说明)
系统功能 管理员功能:首页、个人中心、用户管理、零食分类管理、零食信息管理、订单评价管理、系统管理、订单管理。用户功能:首页、个人中心、订单评价管理、我的收藏管理、订单管理。前台首页功能:首页、零食信息、零食资讯、个人中心、后…...
索引下推(Index Condition Pushdown, ICP)
概念 索引下推是一种数据库查询优化技术,通过在存储引擎层面应用部分WHERE条件来减少不必要的数据读取。它特别适用于复合索引的情况,因为它可以在索引扫描阶段就排除不符合全部条件的数据行,而不是将所有可能匹配的记录加载到服务器层再进行…...
Transformer模型在自然语言处理中的实战应用
基于BERT的文本分类实战:从原理到部署 一、Transformer与BERT核心原理 Transformer模型通过自注意力机制(Self-Attention)突破了RNN的顺序计算限制,BERT(Bidirectional Encoder Representations from Transformers)作为其典型代表,具有两大创新: 双向上下文编码:通过…...
