CMake入门教程【核心篇】属性管理set_property和get_property

news2025/4/8 19:39:11

在这里插入图片描述

😈「CSDN主页」:传送门
😈「Bilibil首页」:传送门
😈「本文的内容」:CMake入门教程
😈「动动你的小手」点赞👍收藏⭐️评论📝


文章目录

  • 1.概述
  • 2.设置属性 - `set_property`
    • 2.1基本语法
    • 2.2示例
  • 3.获取属性 - `get_property`
    • 3.1基本语法
    • 3.2示例
  • 4.实例
    • 4.1 demo1设定编译参数
    • 4.2 demo2定义C++标准
    • 4.3 demo3-设置编译器定义
  • 5.实战使用技巧与注意事项

1.概述

在CMake中,属性管理是构建系统的核心部分。通过使用set_propertyget_property命令,开发者可以为目标、测试、源文件、目录及全局设置和获取属性。这些属性控制着构建过程和逻辑。

set_property
get_property
Apply
Retrieve
CMakeLists.txt
Set Property
Get Property
Build Target
Build Information

2.设置属性 - set_property

set_property命令用于设置指定范围内的属性值。

2.1基本语法

set_property(<SCOPE> <NAME> <PROPERTY> <VALUE1> [VALUE2 ...])
  • <SCOPE>:定义属性的作用域。这可以是 GLOBAL(全局范围)、DIRECTORY(目录范围)、TARGET(目标范围)、SOURCE(源文件范围)、TEST(测试范围)或 CACHE(缓存条目范围)。
  • <NAME>:指定属性所属的实体名称。例如,目标的名称或源文件的路径。
  • <PROPERTY>:要设置的属性名称。
  • <VALUE1> [VALUE2 ...]:要设置的属性值。

2.2示例

  • 设置全局属性
set_property(GLOBAL PROPERTY GLOBAL_PROP "Some Value")
  • 设置目标属性
add_executable(my_target main.cpp)
set_property(TARGET my_target PROPERTY CXX_STANDARD 17)
  • 设置目录属性
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY MY_DIR_PROP "Directory Value")
  • 设置源文件属性
set_property(SOURCE src/main.cpp PROPERTY HEADER_FILE_ONLY TRUE)
  • 设置测试属性
add_test(NAME my_test COMMAND my_executable)
set_property(TEST my_test PROPERTY LABELS "MyTestLabel")
  • 设置缓存属性
set_property(CACHE MY_CACHE_VAR PROPERTY TYPE STRING)

3.获取属性 - get_property

get_property 命令在 CMake 中用于获取已定义属性的值。这个命令可以用来查询各种类型的属性,包括目标属性、测试属性、源文件属性等

3.1基本语法

get_property(<variable> <SCOPE> <ITEM_NAME> PROPERTY <PROPERTY_NAME>)
  • <variable>:一个变量,用于存储获取到的属性值。
  • <SCOPE>:定义属性的作用域。这可以是 GLOBAL(全局范围)、DIRECTORY(目录范围)、TARGET(目标范围)、SOURCE(源文件范围)、TEST(测试范围)或 CACHE(缓存条目范围)。
  • <NAME>:指定属性所属的实体名称。例如,目标的名称或源文件的路径。
  • PROPERTY <PROPERTY_NAME>:要获取的属性名称。
  • [SET]:可选参数,如果指定,只有当属性被显式设置时,命令才会成功。

3.2示例

  • 获取全局属性
get_property(my_global_value GLOBAL PROPERTY GLOBAL_PROP)
  • 获取目标属性
get_property(my_target_std TARGET my_target PROPERTY CXX_STANDARD)
  • 获取目录属性
get_property(my_dir_prop DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY MY_DIR_PROP)
  • 获取源文件属性
get_property(header_only SOURCE src/main.cpp PROPERTY HEADER_FILE_ONLY)
  • 获取测试属性
get_property(test_labels TEST my_test PROPERTY LABELS)
  • 获取缓存属性
get_property(cache_type CACHE MY_CACHE_VAR PROPERTY TYPE)

4.实例

4.1 demo1设定编译参数

为一个可执行文件目标设置自定义的编译选项,并获取这些选项

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyExecutableProject)

# 添加一个可执行文件
add_executable(MyExecutable main.cpp)

# 为目标设置编译选项
set_property(TARGET MyExecutable PROPERTY COMPILE_OPTIONS "-Wall" "-O3")

# 获取刚刚设置的属性
get_property(compiler_options TARGET MyExecutable PROPERTY COMPILE_OPTIONS)
message(STATUS "Compiler options for MyExecutable: ${compiler_options}")

4.2 demo2定义C++标准

设置全局属性以定义整个项目的C++标准,并获取该属性。

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(GlobalPropertyProject)

# 设置全局属性
set_property(GLOBAL PROPERTY CMAKE_CXX_STANDARD 17)

# 添加一个可执行文件
add_executable(MyExecutable main.cpp)

# 获取全局属性
get_property(cxx_standard GLOBAL PROPERTY CMAKE_CXX_STANDARD)
message(STATUS "Global C++ standard: ${cxx_standard}")

4.3 demo3-设置编译器定义

为当前目录设置编译器定义,并获取这些定义

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(DirectoryPropertyProject)

# 添加一个可执行文件
add_executable(MyExecutable main.cpp)

# 为当前目录设置编译器定义
set_property(DIRECTORY PROPERTY COMPILE_DEFINITIONS "MY_CUSTOM_DEFINITION")

# 获取目录属性
get_property(dir_compile_defs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY COMPILE_DEFINITIONS)
message(STATUS "Compile definitions for current directory: ${dir_compile_defs}")

5.实战使用技巧与注意事项

  1. 合理组织属性:为不同的构建目标和文件设置合适的属性,以便更好地管理和维护项目。
  2. 全局属性管理:利用全局属性进行跨项目的配置共享。
  3. 缓存属性:使用CACHE选项来持久化跨多次构建的配置。
  4. 属性检查:在获取属性前,先检查属性是否已被定义。
  5. 属性名称大小写敏感:确保在设置和获取属性时使用正确的大小写。
  6. 避免名称冲突:选择独特的属性名称,以免与CMake内置属性或其他项目属性冲突。
  7. 了解属性继承机制:目录属性可以被其子目录继承。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1356258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows连接ssh并实现上传下载文件

连接ssh 输入&#xff1a;ssh空格用户名ip地址&#xff0c;然后按Enter 有可能出现下图提示&#xff0c;输入yes 回车即可 输入 password &#xff0c;注意密码是不显示的&#xff0c;输入完&#xff0c;再按回车就行了 以上是端口默认22情况下ssh连接&#xff0c;有些公司它…

c jpeg 编码解码验证数据

1. yuv420p 1616 像素点 384字节全部数据 把上面的384个char从左到右&#xff0c;从上到下的顺序输入文件&#xff0c;就能显示红绿蓝白4个水平条

Qt学习_18_用QtMmlWidget实现界面中显示公式

QtMmlWidget是一个Qt类&#xff0c;可用于呈现用MathML 2.0编写的数学公式。 参考页&#xff1a;QtMmlWidget Class Reference (huihoo.com) 一般MathML 2.0编写的数学公式都保存于一个单独的.xml文件当中&#xff0c;然后QtMmlWidget类去读取这个.xml的内容&#xff0c;就可以…

Oracle导出CSV文件

利用spool spool基本格式&#xff1a; spool 路径文件名 select col1||,||col2||,||col3||,||col4 from tablename; spool off spool常用的设置&#xff1a; set colsep ;    //域输出分隔符 set echo off;    //显示start启动的脚本中的每个sql命令&#xff0c;缺…

【数据采集与预处理】数据接入工具Kafka

目录 一、Kafka简介 &#xff08;一&#xff09;消息队列 &#xff08;二&#xff09;什么是Kafka 二、Kafka架构 三、Kafka工作流程分析 &#xff08;一&#xff09;Kafka核心组成 &#xff08;二&#xff09;写入流程 &#xff08;三&#xff09;Zookeeper 存储结构 …

源头厂家定制直线度测量仪 在线与离线检测均可

直线度的检测不再局限于直尺法、重力法等人工检测方式&#xff0c;随着自动化的发展&#xff0c;直线度检测也更需要自动化方便快捷的检测仪器。为此&#xff0c;研发了在线直线度测量仪与离线直线度测量仪&#xff0c;根据不同的需要&#xff0c;选择合适的设备即可。 数据计…

Java集合框架和泛型

1.Java集合框架 架构图&#xff1a; Java的集合框架是一组用于存储和操作数据的类和接口。它提供了各种数据结构&#xff0c;如列表、集合、映射等&#xff0c;以及用于操作这些数据结构的算法和工具。Java集合框架位于Java.util包中&#xff0c;并且是Java编程中常用的核心组…

ROS学习笔记(二):话题通信、服务通信的了解和对应节点的搭建(C++)

ROS学习笔记&#xff08;二&#xff09;&#xff1a;话题通信、服务通信的了解和对应节点的搭建&#xff08;C和Python&#xff09; 前言一、Topics话题通信&#xff08;C&#xff09;0、自定义msg消息类型文件1、发布者&#xff08;Publisher&#xff09;2、订阅者&#xff08…

引导和服务

目录 一、Linux操作系统引导过程 1、引导过程总览图 2、引导过程的详细步骤 二、系统初始化进程 1、init进程&#xff08;串行启动&#xff09; 2、Systemd&#xff08;并行启动&#xff09; 3、Centos6与Centos7的区别&#xff1a; 4、Systemd单元类型 5、运行级别所…

buuctf 逆向 findkey wp

首先看看怎么个事 点开也就这样了&#xff0c;没有输入的点&#xff0c;感觉和之前的 “刮开有奖” 有一点点相像 winmain长这个样子 看到消息循环了&#xff0c;下一步肯定就是找回调函数了 乍一看还没有&#xff0c;函数一个个点进去看发现sub_401023(hInstance&#xff09…

网站迁移和SEO:损害排名的常见错误

正在规划站点迁移&#xff1f; 迁移是更困难的 - 通常是可怕的 - SEO任务之一。 为了让它发挥作用&#xff0c;你需要避免常见的陷阱&#xff0c;这些陷阱可能会影响你的知名度&#xff0c;并导致流量和收入的损失。 8 月 11 日&#xff0c;我主持了一场赞助的搜索引擎杂志网…

分享10篇优秀论文,涉及图神经网络、大模型优化、表格分析

引言 第38届AAAI人工智能年度会议将于2024年2月在加拿大温哥华举行。今天给大家分享十篇AAAI2024论文&#xff0c;主要涉及图神经网络&#xff0c;大模型幻觉、中文书法文字生成、表格数据分析、KGs错误检测、多模态Prompt、思维图生成等。 论文获取方式&#xff0c;回复&am…

Win32 TEXT()宏学习

之前学习了_T()宏&#xff1b; _T()是MFC的&#xff1b; TEXT()是win32的&#xff1b; _T("")定义于tchar.h&#xff1b; TEXT宏是windows程序设计中经常遇到的宏&#xff0c;定义在 <winnt.h>中&#xff1b; 如果使用UNICODE字符集&#xff0c;则TEXT&…

小兔鲜儿 uniapp - 项目打包

目录 微信小程序端​ 核心步骤​ 步骤图示​ 条件编译​ 条件编译语法​ 打包为 H5 端​ 核心步骤​ 路由基础路径​ 打包为 APP 端​ 微信小程序端​ 把当前 uni-app 项目打包成微信小程序端&#xff0c;并发布上线。 核心步骤​ 运行打包命令 pnpm build:mp-weix…

RK3399平台入门到精通系列讲解(实验篇)IO 多路复用实验之poll实验

🚀返回总目录 文章目录 一、IO 多路复用:poll介绍二、实验源码2.1、Makefile2.2、poll 实验驱动2.3、poll 驱动测试应用程序一、IO 多路复用:poll介绍 IO 多路复用是一种同步的 IO 模型。IO 多路复用可以实现一个进程监视多个文件描述符。 一旦某个文件描述符准备就绪,就通…

三款推荐的 FTP 工具

&#x1f947; 版权: 本文由【墨理学AI】原创、在CSDN首发、各位大佬、敬请查阅&#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 三款推荐的 FTP 工具filezillawinscpFinalShell SSHXftp❤️ 人生苦短&#xff0c; 欢迎…

Excelize 入选“2023开源创新榜”优秀开源项目

近日&#xff0c;由中国科协科学技术传播中心、中国计算机学会、中国通信学会、中国科学院软件研究所共同主办&#xff0c;CSDN 承办的 2023 开源创新榜专家评审会在国家科技传播中心成功举办。Excelize 电子表格文档开源基础库入选“2023开源创新榜”优秀开源项目。 评审委员…

Javaweb之Mybatis的基础操作之删除的详细解析

1.3 删除 1.3.1 功能实现 页面原型&#xff1a; 当我们点击后面的"删除"按钮时&#xff0c;前端页面会给服务端传递一个参数&#xff0c;也就是该行数据的ID。 我们接收到ID后&#xff0c;根据ID删除数据即可。 功能&#xff1a;根据主键删除数据 SQL语句 -- 删除…

java每日一题——输出星星塔(答案及编程思路)

前言&#xff1a; 打好基础&#xff0c;daydayup! 题目&#xff1a;请编写输出如下图的星星塔 编程思路&#xff1a;1&#xff0c;计算要输入几行&#xff1b;2&#xff0c;计算每行的⭐数量&#xff0c;及空格的数量&#xff1b;计算相应的关系&#xff1b; 如图&#xff1a;假…