CMake 属性之目标属性

【写在前面】

        CMake 可以通过属性来存储信息。它就像是一个变量,但它被附加到一些其他的实体上,像是一个目录或者是一个目标。例如一个全局的属性可以是一个有用的非缓存的全局变量。

        在 CMake 的众多属性中,目标属性 ( Target Properties ) 扮演着尤为重要的角色,它们直接关联到最终生成的可执行文件、库文件等构建产物。

        更直观一点,如果把目标类比为 类 ( Class ),那么目标属性则类似 类成员 ( Class  Member )

class Target {string target_property;
};

【正文开始】

        生成目标的方式有三种:

#生成可执行文件目标test
add_executable(test test.cpp)
#生成共享库目标test_lib
add_library(test_lib SHARED test.cpp)
#生成静态库目标test_lib
add_library(test_lib STATIC test.cpp)
        定义目标属性:

        给目标定义属性的命令为:

define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |TEST | VARIABLE | CACHED_VARIABLE>PROPERTY <name> [INHERITED][BRIEF_DOCS <brief-doc> [docs...]][FULL_DOCS <full-doc> [docs...]][INITIALIZE_FROM_VARIABLE <variable>])

在范围内定义一个属性,用于 set_property() 和 get_property() 命令。它主要用于定义属性的初始化或继承方式。从历史上看,该命令还将文档与属性相关联,但这不再被视为主要用例。

        示例:

# 定义一个目标属性 TEST_TARGET,带有简短和详细描述 
define_property(TARGET PROPERTY TEST_TARGET BRIEF_DOCS "A test property"FULL_DOCS "A long description of this test property"
)
        设置目标属性:

        给目标设置属性的命令为:

set_property(<GLOBAL                      |DIRECTORY [<dir>]           |TARGET    [<target1> ...]   |SOURCE    [<src1> ...][DIRECTORY <dirs> ...][TARGET_DIRECTORY <targets> ...] |INSTALL   [<file1> ...]     |TEST      [<test1> ...]     |CACHE     [<entry1> ...]    >[APPEND] [APPEND_STRING]PROPERTY <name> [<value1> ...])

在范围的零个或多个对象上设置一个属性。

         其中,有一个专用于设置目标属性命令:

set_target_properties(target1 target2 ...PROPERTIES prop1 value1prop2 value2 ...)

设置目标的属性。该命令的语法是列出您要更改的所有目标,然后提供您接下来要设置的值。您可以使用任何您想要的 prop 值对,稍后使用 get_property() 或 get_target_property() 命令提取它。

        示例:

# 设置目标 TEST_TARGET 的属性 P_1 和 P_2 的值
set_target_properties(TEST_TARGET PROPERTIESP_1 "这是属性P_1的值"P_2 "这是属性P_2的值" 
)
        获取目标属性:

        获取目标的属性的命令为:

get_property(<variable><GLOBAL             |DIRECTORY [<dir>]  |TARGET    <target> |SOURCE    <source>[DIRECTORY <dir> | TARGET_DIRECTORY <target>] |INSTALL   <file>   |TEST      <test>   |CACHE     <entry>  |VARIABLE           >PROPERTY <name>[SET | DEFINED | BRIEF_DOCS | FULL_DOCS])

从范围内的一个对象获取一个属性。

        其中,有一个专用于获取目标属性命令:

get_target_property(<VAR> target property)

从目标获取属性。属性的值存储在变量“<VAR>”中。如果未找到目标属性,则行为取决于它是否已被定义为 INHERITED 属性(请参阅:command:define_property)。非继承属性会将``<VAR>``设置为``<VAR>-NOTFOUND``,而继承属性将搜索相关的父范围,如 define_property() 命令所述,如果仍然找不到属性 <VAR> 将被设置为空字符串。

使用 set_target_properties() 设置目标属性值。属性通常用于控制目标的构建方式,但有些属性会查询目标。此命令可以获得迄今为止创建的任何目标的属性。目标不需要位于当前的 CMakeLists.txt 文件中。

        示例:

# 获取目标 TEST_TARGET 的属性 P_1 的值,并将其存储在变量 TEST_TARGET_P1 中
get_target_property(TEST_TARGET_P1 TEST_TARGET P_1) 

         最后完整测试一遍:

# 要求 CMake 最低版本为 3.16
cmake_minimum_required(VERSION 3.16)# 定义项目名称为 PROPERTY_TEST,版本号为 1.0,使用 C++ 语言
project(PROPERTY_TEST VERSION 1.0 LANGUAGES CXX)# 添加一个名为 TEST_TARGET 的可执行文件,其源文件为 test.cpp
add_executable(TEST_TARGET test.cpp)# 定义一个目标属性 TEST_TARGET,带有简短和详细描述 
define_property(TARGET PROPERTY TEST_TARGET BRIEF_DOCS "A test property"FULL_DOCS "A long description of this test property"
)# 设置目标 TEST_TARGET 的属性 P_1 和 P_2 的值
set_target_properties(TEST_TARGET PROPERTIESP_1 "这是属性P_1的值"P_2 "这是属性P_2的值" 
)# 获取目标 TEST_TARGET 的属性 P_1 的值,并将其存储在变量 TEST_TARGET_P1 中
get_target_property(TEST_TARGET_P1 TEST_TARGET P_1) # 打印变量 TEST_TARGET_P1 的值
message("TEST_TARGET_P1: ${TEST_TARGET_P1}") 

        CMake 输出如下:


【结语】

        最后,属性在 CMake 中是可继承的。这意味着,如果一个目标继承了另一个目标的属性,那么它将自动获得父目标的属性值。这种继承关系在构建大型项目时非常有用,因为它减少了重复的配置。

        CMake 的属性系统是一个强大的工具,它提供了细粒度的控制,允许我们定制构建过程。通过合理使用属性,我们可以创建更加灵活和可维护的构建系统。掌握属性的使用,是每个 CMake 用户进阶的必经之路,希望这篇文章能够帮助你更好地理解和使用 CMake 的属性系统。

        项目链接(多多star呀..⭐_⭐):

        Github 地址:GitHub - mengps/LearnCMake: CMake 开发之旅系列教程源码CMake 开发之旅系列教程源码. Contribute to mengps/LearnCMake development by creating an account on GitHub.icon-default.png?t=O83Ahttps://github.com/mengps/LearnCMake

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

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

相关文章

NodeJS智慧社区管理微信小程序-计算机毕业设计源码40623

摘 要 随着中国经济的飞速增长&#xff0c;消费者的智能化水平不断提高&#xff0c;许多智能手机和相关的软件正在得到更多的关注和支持。其中&#xff0c;智慧社区管理微信小程序更是深得社区人员的喜爱&#xff0c;它的出现极大地改善了社区人员的生活质量&#xff0c;同时&…

宠物咖啡馆在线体验:SpringBoot框架的创新应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

云微客AI直播矩阵,让小白轻松上手的必备直播利器

现在直播带货都已经杀疯了&#xff0c;在新趋势下&#xff0c;AI智能直播应运而生。AI智能直播相较于传统直播&#xff0c;直播模式对于场地的要求和人员的要求都相对较低&#xff0c;大大降低了我们的试错成本&#xff0c;同时直播矩阵系统也为企业和个人带来了低成本、高效率…

浅析基于双碳目标的光储充一体化电站状态评估技术

摘要&#xff1a;全国碳市场拉开了我国能源结构加速转型的大幕&#xff0c;催生了光伏、储能和新能源汽车等一批绿色产业的兴起&#xff0c;同时随着利好政策扶植和消费者的青睐&#xff0c;光伏、储能和新能源汽车市场均加快发展。但传统的充电桩和光伏电站都是分开建设&#…

如何在电脑上创建虚拟网卡

1.右键点击此电脑&#xff0c;选择——管理 2.选择设备管理器——网络适配器&#xff0c;在点击操作选择 添加过时硬件 3.点击 下一页 4.在这里选择网络适配器&#xff0c;点击下一页 5.选择微软的环回适配器 6.打开控制面板 7.点击网络和Internet 8.点击网络和共享中心 9…

一个读取CT图像序列,并进行表面重建的C++代码

这篇文章中&#xff0c;介绍使用VTK进行读取CT图像&#xff08;一个序列&#xff09;&#xff0c;然后进行表面重建。为什么不使用DCMTK呢&#xff1f;因为使用DCMTK需要一张一张读取&#xff0c;要自己写一个代码&#xff0c;还要创建一个容器来放读入的CT数据&#xff0c;比较…

亳州自闭症寄宿制学校,关注孩子的学习和生活

在特殊教育领域&#xff0c;自闭症儿童的教育与成长一直是社会各界关注的焦点。近年来&#xff0c;随着对自闭症认识的加深&#xff0c;越来越多的寄宿制学校应运而生&#xff0c;致力于为这些特殊的孩子提供全面、个性化的教育服务。在安徽亳州&#xff0c;这样的学校正努力为…

Metasploit渗透测试之后渗透

简介 Metasploit拥有300多个后渗透模块&#xff0c;是渗透测试的最佳框架之一&#xff0c;覆盖了从信息收集到后渗透甚至报告的每个阶段。本章将重点介绍提权、持久化、获取凭证和横向移动等内容。 # 1、后渗透模块 在Metasploit框架升级后&#xff0c;用于自动化后渗透任务…

C++——类和对象(二)

1. 类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。⼀个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默认成员函数&#xff0c;需要注意的是这6个中最重要的是前4个&#xff0c;最后两个取地址重载不…

某国有资本运营中心人才选拔项目纪实

某国有资本运营中心人才选拔项目纪实 【客户行业】 政府与事业单位 【问题类型】 人才招聘选拔 【客户背景】 在三年国企改革过程中&#xff0c;南方某省政府为响应国家政策&#xff0c;提出组建专业化国有资本投资运营公司&#xff0c;大力开展专业化资本运营&#xff0c;…

移除元素(算法题分享)

移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k&#xff0c;要通过此题&#xff0c;您需要执行以下操作&#xf…

MySQL从0到1基础语法笔记(上)

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java Web关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 MySQL笔记&#xff1a; 一、注释&#xff1a; 二、SQL四大类&#xff…

什么是安全漏洞?最全的漏洞分类!

01 — “ 什么是漏洞**”** 漏洞是指一个系统存在的弱点或缺陷&#xff0c;系统对特定威胁攻击或危险事件的敏感性&#xff0c;或进行攻击的威胁作用的可能性。漏洞可能来自应用软件或操作系统设计时的缺陷或编码时产生的错误&#xff0c;也可能来自业务在交互处理过程中的设…

丝杆支撑座预压标准解析

丝杆支撑座预压的主要目的是提高轴的旋转精度、刚性和运行性能&#xff0c;同时防止轴在运转过程中产生震动和异响&#xff0c;从而提高系统的整体精度和稳定性。那么&#xff0c;丝杆支撑座的预压标准是什么呢&#xff1f; 丝杆支撑座的预压可以分为标准型轻预压和标准型重预压…

自动生成实体类,mapper类,mapper.xml文件

使用mybatis generator&#xff08;无需安装&#xff0c;对于外网有限制的真的很友好&#xff09; 1. 在pom文件中配置mysql相关依赖&#xff0c;并添加plugin <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId…

GIS专业的就业前景

地理信息系统&#xff08;GIS&#xff09;作为一门跨学科的领域&#xff0c;随着技术的发展和应用领域的拓宽&#xff0c;其就业前景日益广阔。GIS专业毕业生可以在多个行业中找到合适的职位&#xff0c;并且随着经验的积累&#xff0c;薪资和职业发展空间都相当可观。 1. 就业…

H7-TOOL的1拖4脱机烧录SPI Flash芯片XM25QU64在1.8V供电时满速下载的稳定性测试

XM25QU64规格&#xff1a; XM25QU64C实测1.8V&#xff08;脱机烧录上位机这里和微型数控电源界面都设置TVCC为1.8V&#xff09; &#xff0c;1拖4转接板方式&#xff0c;直接将芯片放入转接板&#xff0c;稳定好用&#xff1a; 时钟电平1.8V实际效果&#xff1a;

centos7安装node18及升级glbic

centos7安装node18及升级glbic CentOS7安装nodejs18及以上版本会报错&#xff0c;glibc版本过低 安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash source ~/.nvm/nvm.shnvm install 18 nvm use 18#设置默认版本 nvm alias defau…

hznu.dodo C++ 实验A 文件

1.【描述】 输入10个整数存入文本文件example.txt中&#xff0c;文件每行存放5个整数&#xff0c;每行整数之间用一个空格间隔。行末不能有多余的空格。 【输入】 输入10个整数。 【输出】 生成文件example.txt&#xff0c;里面存放输入的10个整数。 不需要在屏幕上显示整数。 …

CISP vs CISSP | 不知道选哪个?这篇告诉你答案

CISP与CISSP有什么区别&#xff1f;我到底考哪个呢&#xff1f;哪个难一点&#xff1f;哪个含金量高&#xff1f; 这些问题一篇为你全部解答&#xff01; 01 概念和发证机构的差异 CISP&#xff0c;“Certified Information Security Professional”&#xff0c;即注册信息安…