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

在这里插入图片描述

😈「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.mzph.cn/news/597025.shtml

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

相关文章

FPGA设计时序约束十五、Set_Bus_Skew

目录 一、序言 二、Set Bus Skew 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 报告分析 三、工程示例 3.1 工程代码 3.2 时序报告 四、参考资料 一、序言 在时序约束中&#xff0c;对时钟的约束除了set clock latency,set clock uncertainty,set input jitter外&…

51、全连接 - 特征的全局融合

Resnet50 中的核心算法,除了卷积、池化、bn、relu之外,在最后一层还有一个全连接。 下图是 Resnet50 网络结构结尾的部分,最后一层 Gemm(通用矩阵乘法)实现的就是全连接操作。而矩阵乘法我们之前介绍过,传送门在:矩阵乘。 卷积也好,矩阵乘法也好,其目的都是为了完成神…

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式)

JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式) 文章目录 JavaWeb基础&#xff08;1&#xff09;- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件…

2024.1.2 Redis 数据类型 Stream、Geospatial、HyperLogLog、Bitmaps、Bitfields 简介

目录 引言 Stream 类型 Geospatial 类型 HyperLogLog 类型 Bitmaps 类型 Bitfields 类型 引言 Redis 最关键&#xff08;应用广泛、频繁使用&#xff09;的五个数据类型 StringListHashSetZSet 下文介绍的数据类型一般适合在特定的场景中使用&#xff01; Stream 类型 St…

Redis命令---Hash(哈希)篇 (超全)

目录 1.Redis Hmset 命令 - 同时将多个 field-value (域-值)对设置到哈希表 key 中。简介语法可用版本: > 2.0.0返回值: 如果命令执行成功&#xff0c;返回 OK 。 示例 2.Redis Hmget 命令 - 获取所有给定字段的值简介语法可用版本: > 2.0.0返回值: 一个包含多个给定字段…

LangChain与昇腾

LangChain这个词今年已经听烂了&#xff0c;今天基于昇腾的角度总结一下&#xff1a; Why LangChain &#xff1f; 场景&#xff1a;构建一个LLM应用 在构建一个新项目时&#xff0c;可能会遇到许多API接口、数据格式和工具。要去研究每一个工具、接口很麻烦。 假设要构建一…

k8s二进制部署2

部署 Worker Node 组件 //在所有 node 节点上操作 #创建kubernetes工作目录 mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs} #上传 node.zip 到 /opt 目录中&#xff0c;解压 node.zip 压缩包&#xff0c;获得kubelet.sh、proxy.sh cd /opt/ unzip node.zip chmod x kubelet.…

3分钟了解syscall系统调用|详细易懂的流程

文章目录 syscall1.简介2.详细解释3.具体举例4.比喻解释5.作用6.优点7.总结 syscall和int 0x80有什么不同&#xff1f;1. 上下文切换效率2. 指令执行流程3. 兼容性总结 syscall 具体流程1. 用户空间准备2. 执行syscall指令3. 切换到内核态4. 内核模式下执行系统调用5. 返回用户…

Unity3D UGUI图集打包与动态使用(TexturePacker)

制作图集的好处&#xff1a; 众所周知CPU是用来处理游戏的逻辑运算的&#xff0c;而GPU是用来处理游戏中图像的。在GPU中&#xff0c;我们要绘制一个图像需要提交图片&#xff08;纹理&#xff09;到显存&#xff0c;然后再进行绘制&#xff08;在这个过程中会产生一次DrawCall…

vue3 + TS + vite 搭建中后台管理系统(完整项目)

vue3 TS vite 搭建中后台管理系统&#xff08;完整项目&#xff09; 前言1、搭建步骤及方法2、集成多种插件功能&#xff0c;实现中后台按需使用3、新手学TS如何快速进入状态、定义TS类型4、layout搭建四款常见风格6、大屏搭建效果5、vue3Ts运营管理系统总结&#xff1a; 前言…

three.js相机按照指定路线在建筑模型中漫游(支持开始,暂停)

three.js相机按照指定路线在模型中漫游&#xff08;支持开始&#xff0c;暂停&#xff09; 关键点 相机运动曲线 // 相机路线 const points [new THREE.Vector3(0, 40, 300),new THREE.Vector3(50, 40, 300),new THREE.Vector3(50, 40, 50),new THREE.Vector3(150, 40, 50),…

详细解读QLC SSD无效编程问题-2

作者通过SimpleSSD仿真模型&#xff0c;采用SLCQLC混合模式来开展进一步的验证工作。评估过程中&#xff0c;当写入请求到达固态硬盘时&#xff0c;首先会被写入缓存&#xff08;DRAM&#xff09;&#xff0c;然后才被回写到NAND。文中引入了一个名叫做LRU(Least Recently Used…

【Unity中的A星寻路】Navigation导航寻路系统四大页签详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

几种读nii图像方法的轴序比较

读 .nii / .nii.gz 图像并转成 numpy 可用 medpy.io、nibabel、itk、SimpleITK 几种方法&#xff0c;然而几种方法读出来的轴序有出入&#xff0c;本篇比较此几种方法。 Datum 所用数据来自 verse&#xff0c;经 iTomxy/data/verse/preprocess.py 预处理&#xff0c;朝向和轴…

【观察】Aginode安捷诺:坚守“长期主义”,服务中国数字经济

毫无疑问&#xff0c;随着整个社会加速数字化转型&#xff0c;尤其是5G、人工智能、大数据等技术兴起&#xff0c;以及智慧医疗、智慧金融、智能制造等应用加速落地&#xff0c;算力网络在经济社会发展中扮演了愈来愈重要的角色&#xff0c;成为支撑数字经济蓬勃发展的“新引擎…

根本记不住MySQL进阶查询语句

1 MySQL进阶查询 1.1 MySQL进阶查询的语句 全文以数据库location和Store_Info为实例 ---- SELECT ----显示表格中一个或数个字段的所有数据记录 语法&#xff1a;SELECT "字段" FROM "表名"; select 列名 from 表名 ; ---- DISTINCT ----不显示重复的数…

高清网络视频监控平台的应用-城市大交通系统视联网

目 录 一、应用需求 二、系统架构设计 三、功能介绍 1.实时视频监控 2.云台控制 3.语音功能 4. 录像管理与回放 5.告警联动 6.多种显示终端呈现 &#xff08;1&#xff09;CS客户端 &#xff08;2&#xff09;web客户端 &#xff08;3&#xf…

seo分享:慎重使用蜘蛛池

其实要提高搜索引擎蜘蛛的来访次数&#xff0c;唯一的方法还是要通过网站本身的内容更新。频繁更新有质量的内容&#xff0c;才能够提高蜘蛛的来访次数。如果本身内容更新不多&#xff0c;外部引流的蜘蛛过多&#xff0c;最终发现没什么内容索引&#xff0c;蜘蛛来访的次数也会…

【竞技宝】DOTA2:tundra宣布解散旗下阵容 whitemon留队

北京时间2024年1月4日&#xff0c;在DOTA2ESL吉隆坡站的比赛结束后&#xff0c;最近将要迎来的是BB Dacha别墅杯的预选赛&#xff0c;目前随着AR官宣新赛季阵容&#xff0c;国内一线队伍都已经全部公布了大名单。而国外还有一些队伍仍在进行人员调整&#xff0c;其中就包括前TI…

Strict MIME type checking is enforced for module scripts per HTML spec.

目录 前言错误信息如下:前言 最近使用docker打包Nginx和vue 为镜像文件,启动镜像时报错 错误信息如下: index89886.js:1 Failed to load module script: Expected a JavaScript module script but the server responded with a MIME type of "text/html". Stri…